diff --git a/src/node_zlib.cc b/src/node_zlib.cc index 3674919d47..deacb713d9 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. diff --git a/test/simple/test-zlib-dictionary-fail.js b/test/simple/test-zlib-dictionary-fail.js index f6d1869903..fd35a0192a 100644 --- a/test/simple/test-zlib-dictionary-fail.js +++ b/test/simple/test-zlib-dictionary-fail.js @@ -34,3 +34,15 @@ var zlib = require('zlib'); // String "test" encoded with dictionary "dict". stream.write(Buffer([0x78,0xBB,0x04,0x09,0x01,0xA5])); })(); + +// Should raise an error, not trigger an assertion in src/node_zlib.cc +(function() { + var stream = zlib.createInflate({ dictionary: Buffer('fail') }); + + stream.on('error', common.mustCall(function(err) { + assert(/Bad dictionary/.test(err.message)); + })); + + // String "test" encoded with dictionary "dict". + stream.write(Buffer([0x78,0xBB,0x04,0x09,0x01,0xA5])); +})();