This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

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.
  • Loading branch information...
1 parent bc76624 commit 4b48042c175b6b8ea042a18853c9873ca1a587f8 @pgriess pgriess committed with ry Jun 15, 2010
Showing with 14 additions and 6 deletions.
  1. +14 −6 lib/net.js
View
@@ -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;

0 comments on commit 4b48042

Please sign in to comment.