summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/zlib.js9
-rw-r--r--test/parallel/test-zlib-close-in-ondata.js10
-rw-r--r--test/parallel/test-zlib-destroy.js13
3 files changed, 32 insertions, 0 deletions
diff --git a/lib/zlib.js b/lib/zlib.js
index 61f57429d6..c833afff14 100644
--- a/lib/zlib.js
+++ b/lib/zlib.js
@@ -430,6 +430,11 @@ Zlib.prototype.close = function close(callback) {
this.destroy();
};
+Zlib.prototype._destroy = function _destroy(err, callback) {
+ _close(this);
+ callback(err);
+};
+
Zlib.prototype._transform = function _transform(chunk, encoding, cb) {
var flushFlag = this._defaultFlushFlag;
// We use a 'fake' zero-length chunk to carry information about flushes from
@@ -592,6 +597,10 @@ function processCallback() {
assert(false, 'have should not go down');
}
+ if (self.destroyed) {
+ return;
+ }
+
// exhausted the output buffer, or used all the input create a new one.
if (availOutAfter === 0 || self._outOffset >= self._chunkSize) {
handle.availOutBefore = self._chunkSize;
diff --git a/test/parallel/test-zlib-close-in-ondata.js b/test/parallel/test-zlib-close-in-ondata.js
new file mode 100644
index 0000000000..44d996311d
--- /dev/null
+++ b/test/parallel/test-zlib-close-in-ondata.js
@@ -0,0 +1,10 @@
+'use strict';
+
+const common = require('../common');
+const zlib = require('zlib');
+
+const ts = zlib.createGzip();
+const buf = Buffer.alloc(1024 * 1024 * 20);
+
+ts.on('data', common.mustCall(() => ts.close()));
+ts.end(buf);
diff --git a/test/parallel/test-zlib-destroy.js b/test/parallel/test-zlib-destroy.js
new file mode 100644
index 0000000000..d8eab42186
--- /dev/null
+++ b/test/parallel/test-zlib-destroy.js
@@ -0,0 +1,13 @@
+'use strict';
+
+require('../common');
+
+const assert = require('assert');
+const zlib = require('zlib');
+
+// verify that the zlib transform does clean up
+// the handle when calling destroy.
+
+const ts = zlib.createGzip();
+ts.destroy();
+assert.strictEqual(ts._handle, null);