From e1a72f0e2e4fa668d73657c55ed399f674af6ec0 Mon Sep 17 00:00:00 2001 From: isaacs Date: Tue, 29 Mar 2011 14:54:49 -0700 Subject: [PATCH] Closes GH-535 Immediate pause/resume race condition Calling resume() immediately after calling pause() would trigger a race condition where it would try to read() from a file descriptor that was already being read from, causing an EBADF --- lib/fs.js | 5 ++++- test/simple/test-fs-read-stream.js | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/fs.js b/lib/fs.js index 5329290f2a0..0f2318d5845 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -838,7 +838,9 @@ ReadStream.prototype.setEncoding = function(encoding) { ReadStream.prototype._read = function() { var self = this; - if (!self.readable || self.paused) return; + if (!self.readable || self.paused || self.reading) return; + + self.reading = true; if (!pool || pool.length - pool.used < kMinPoolSpace) { // discard the old pool. Can't add to the free list because @@ -864,6 +866,7 @@ ReadStream.prototype._read = function() { } function afterRead(err, bytesRead) { + self.reading = false; if (err) { self.emit('error', err); self.readable = false; diff --git a/test/simple/test-fs-read-stream.js b/test/simple/test-fs-read-stream.js index 8b821c01d8f..188c95d52db 100644 --- a/test/simple/test-fs-read-stream.js +++ b/test/simple/test-fs-read-stream.js @@ -42,8 +42,13 @@ file.addListener('open', function(fd) { callbacks.open++; assert.equal('number', typeof fd); assert.ok(file.readable); -}); + // GH-535 + file.pause(); + file.resume(); + file.pause(); + file.resume(); +}); file.addListener('data', function(data) { assert.ok(data instanceof Buffer);