Skip to content

Commit

Permalink
Wrap FD in closure before emitting from Stream.
Browse files Browse the repository at this point in the history
- Without this, recvMsg can be invoked before the event emitter gets a
  chance to run. In this case, recvMsg.fd will be overwritten and the
  original caller can end up emitting null.
  • Loading branch information
pgriess authored and ry committed Jun 15, 2010
1 parent bc76624 commit 4b48042
Showing 1 changed file with 14 additions and 6 deletions.
20 changes: 14 additions & 6 deletions lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -294,13 +294,21 @@ function setImplmentationMethods (self) {
self._readImpl = function(buf, off, len, calledByIOWatcher) {
var bytesRead = recvMsg(self.fd, buf, off, len);

// Do not emit this in the same stack, otherwise we risk corrupting
// our buffer pool which is full of read data, but has not had
// had its pointers updated just yet.
// Do not emit this in the same stack, otherwise we risk corrupting our
// buffer pool which is full of read data, but has not had had its
// pointers updated just yet.
//
// Save off recvMsg.fd in a closure so that, when we emit it later, we're
// emitting the same value that we see now. Otherwise, we can end up
// calling emit() after recvMsg() has been called again and end up
// emitting null (or another FD).
if (recvMsg.fd !== null) {
process.nextTick(function() {
self.emit('fd', recvMsg.fd);
});
(function () {
var fd = recvMsg.fd;
process.nextTick(function() {
self.emit('fd', fd);
});
})();
}

return bytesRead;
Expand Down

0 comments on commit 4b48042

Please sign in to comment.