From cd03f5bdf5bed1e7cc30e78ca06c2652dac3a074 Mon Sep 17 00:00:00 2001 From: Robert Nagy <ronagy@icloud.com> Date: Sun, 8 Sep 2019 10:35:34 +0200 Subject: [PATCH 1/2] stream: don't call _read after destroy() --- lib/_stream_readable.js | 7 ++++--- lib/internal/fs/streams.js | 3 --- test/parallel/test-stream-readable-destroy.js | 9 +++++++++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index cfa36731e3d661..29248a4aa4de5c 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -487,9 +487,10 @@ Readable.prototype.read = function(n) { debug('length less than watermark', doRead); } - // However, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - if (state.ended || state.reading) { + // However, if we've ended, then there's no point, if we're already + // reading, then it's unnecessary, and if we're destroyed, then it's + // not allowed. + if (state.ended || state.reading || state.destroyed) { doRead = false; debug('reading or ended', doRead); } else if (doRead) { diff --git a/lib/internal/fs/streams.js b/lib/internal/fs/streams.js index d51fbb1b580113..b0c4224893e9a6 100644 --- a/lib/internal/fs/streams.js +++ b/lib/internal/fs/streams.js @@ -137,9 +137,6 @@ ReadStream.prototype._read = function(n) { }); } - if (this.destroyed) - return; - if (!pool || pool.length - pool.used < kMinPoolSpace) { // Discard the old pool. allocNewPool(this.readableHighWaterMark); diff --git a/test/parallel/test-stream-readable-destroy.js b/test/parallel/test-stream-readable-destroy.js index 05e7dd464ddca0..7687ea90cc82d8 100644 --- a/test/parallel/test-stream-readable-destroy.js +++ b/test/parallel/test-stream-readable-destroy.js @@ -189,3 +189,12 @@ const assert = require('assert'); read.push('hi'); read.on('data', common.mustNotCall()); } + +{ + const read = new Readable({ + read: common.mustNotCall(function() {}) + }); + read.destroy(); + assert.strictEqual(read.destroyed, true); + read.read(); +} From fd8f2b688c6812b4e28ac321e399e8e7947ec79d Mon Sep 17 00:00:00 2001 From: Robert Nagy <ronagy@icloud.com> Date: Wed, 11 Sep 2019 21:56:14 +0200 Subject: [PATCH 2/2] fixup: wrap test --- test/parallel/test-wrap-js-stream-exceptions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/parallel/test-wrap-js-stream-exceptions.js b/test/parallel/test-wrap-js-stream-exceptions.js index cde7c178446a11..eeab26f525ae50 100644 --- a/test/parallel/test-wrap-js-stream-exceptions.js +++ b/test/parallel/test-wrap-js-stream-exceptions.js @@ -10,7 +10,7 @@ process.once('uncaughtException', common.mustCall((err) => { })); const socket = new JSStreamWrap(new Duplex({ - read: common.mustCall(), + read: common.mustNotCall(), write: common.mustCall((buffer, data, cb) => { throw new Error('exception!'); })