summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/node_zlib.cc14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/node_zlib.cc b/src/node_zlib.cc
index 3674919d4..deacb713d 100644
--- a/src/node_zlib.cc
+++ b/src/node_zlib.cc
@@ -163,12 +163,16 @@ class ZCtx : public ObjectWrap {
ctx->err_ = inflateSetDictionary(&ctx->strm_,
ctx->dictionary_,
ctx->dictionary_len_);
- // TODO Handle Z_DATA_ERROR, wrong dictionary
- assert(ctx->err_ == Z_OK && "Failed to set dictionary");
if (ctx->err_ == Z_OK) {
// And try to decode again
ctx->err_ = inflate(&ctx->strm_, ctx->flush_);
+ } else if (ctx->err_ == Z_DATA_ERROR) {
+
+ // Both inflateSetDictionary() and inflate() return Z_DATA_ERROR.
+ // Make it possible for After() to tell a bad dictionary from bad
+ // input.
+ ctx->err_ = Z_NEED_DICT;
}
}
break;
@@ -196,7 +200,11 @@ class ZCtx : public ObjectWrap {
// normal statuses, not fatal
break;
case Z_NEED_DICT:
- ZCtx::Error(ctx, "Missing dictionary");
+ if (ctx->dictionary_ == NULL) {
+ ZCtx::Error(ctx, "Missing dictionary");
+ } else {
+ ZCtx::Error(ctx, "Bad dictionary");
+ }
return;
default:
// something else.