Skip to content

Commit e1a72f0

Browse files
isaacsry
authored andcommitted
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
1 parent 4d64f36 commit e1a72f0

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

lib/fs.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -838,7 +838,9 @@ ReadStream.prototype.setEncoding = function(encoding) {
838838

839839
ReadStream.prototype._read = function() {
840840
var self = this;
841-
if (!self.readable || self.paused) return;
841+
if (!self.readable || self.paused || self.reading) return;
842+
843+
self.reading = true;
842844

843845
if (!pool || pool.length - pool.used < kMinPoolSpace) {
844846
// discard the old pool. Can't add to the free list because
@@ -864,6 +866,7 @@ ReadStream.prototype._read = function() {
864866
}
865867

866868
function afterRead(err, bytesRead) {
869+
self.reading = false;
867870
if (err) {
868871
self.emit('error', err);
869872
self.readable = false;

test/simple/test-fs-read-stream.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,13 @@ file.addListener('open', function(fd) {
4242
callbacks.open++;
4343
assert.equal('number', typeof fd);
4444
assert.ok(file.readable);
45-
});
4645

46+
// GH-535
47+
file.pause();
48+
file.resume();
49+
file.pause();
50+
file.resume();
51+
});
4752

4853
file.addListener('data', function(data) {
4954
assert.ok(data instanceof Buffer);

0 commit comments

Comments
 (0)