diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/node_zlib.cc | 14 |
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. |