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!');
   })