From 4b48042c175b6b8ea042a18853c9873ca1a587f8 Mon Sep 17 00:00:00 2001 From: Peter Griess Date: Tue, 15 Jun 2010 15:33:44 -0500 Subject: [PATCH] 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. --- lib/net.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) 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;