diff options
author | Fedor Indutny <fedor@indutny.com> | 2014-11-06 22:03:08 +0300 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2014-12-04 18:10:13 +0300 |
commit | 8c868989be778246bc4b9558f087d0f93724b83d (patch) | |
tree | 821bbc1bfe893024cc4aaee98506b041a6094935 | |
parent | f9456a2d3657145878dfcae52af1defc1e22e3bb (diff) | |
download | node-8c868989be778246bc4b9558f087d0f93724b83d.tar.gz |
zlib: do not Unref() if wasn't Ref()ed
In very unlikely case, where `deflateInit2()` may return error (right
now happening only on exhausting all memory), the `ZCtx::Error()` will
be called and will try to `Unref()` the handle. But the problem is that
this handle was never `Ref()`ed, so it will trigger an assertion error
and crash the program.
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
PR-URL: https://github.com/joyent/node/pull/8687
-rw-r--r-- | src/node_zlib.cc | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/node_zlib.cc b/src/node_zlib.cc index 5c8578d86..e87a704ce 100644 --- a/src/node_zlib.cc +++ b/src/node_zlib.cc @@ -307,8 +307,9 @@ class ZCtx : public ObjectWrap { MakeCallback(ctx->handle_, onerror_sym, ARRAY_SIZE(args), args); // no hope of rescue. + if (ctx->write_in_progress_) + ctx->Unref(); ctx->write_in_progress_ = false; - ctx->Unref(); if (ctx->pending_close_) ctx->Close(); } |