Skip to content

Instantly share code, notes, and snippets.

@pgriess
Created June 15, 2010 20:35
Show Gist options
  • Save pgriess/439690 to your computer and use it in GitHub Desktop.
Save pgriess/439690 to your computer and use it in GitHub Desktop.
- 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 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/lib/net.js b/lib/net.js
index 24e1f7a..ac5f568 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;
--
1.7.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment