diff --git a/lib/net.js b/lib/net.js index 24e1f7aaa3..ac5f56825c 100644 --- a/lib/net.js +++ b/lib/net.js @@ -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;