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;