Browse Source

Wrap FD in closure before emitting from Stream.

- 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.
v0.7.4-release
Peter Griess 15 years ago
committed by Ryan Dahl
parent
commit
4b48042c17
  1. 16
      lib/net.js

16
lib/net.js

@ -294,13 +294,21 @@ function setImplmentationMethods (self) {
self._readImpl = function(buf, off, len, calledByIOWatcher) { self._readImpl = function(buf, off, len, calledByIOWatcher) {
var bytesRead = recvMsg(self.fd, buf, off, len); var bytesRead = recvMsg(self.fd, buf, off, len);
// Do not emit this in the same stack, otherwise we risk corrupting // Do not emit this in the same stack, otherwise we risk corrupting our
// our buffer pool which is full of read data, but has not had // buffer pool which is full of read data, but has not had had its
// had its pointers updated just yet. // 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) { if (recvMsg.fd !== null) {
(function () {
var fd = recvMsg.fd;
process.nextTick(function() { process.nextTick(function() {
self.emit('fd', recvMsg.fd); self.emit('fd', fd);
}); });
})();
} }
return bytesRead; return bytesRead;

Loading…
Cancel
Save