summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFedor Indutny <fedor.indutny@gmail.com>2014-02-26 14:37:13 +0400
committerTimothy J Fontaine <tjfontaine@gmail.com>2014-03-05 09:36:35 -0800
commit5e06ce4fb949ab9bd5a7105dc0e8d924fd911d0c (patch)
treeecd1e78c5395812c6888cea273f252487052aecd
parenta9d24fa40d2e02860efa7653164c0c4e0d515457 (diff)
downloadnode-5e06ce4fb949ab9bd5a7105dc0e8d924fd911d0c.tar.gz
child_process: fix sending handle twice
When sending a socket to a child process via IPC pipe, `child_process.js` picks a raw UV handle from `_handle` property, sends it, and assigns `null` to the property. Sending the same socket twice was resulting in a runtime error, since we weren't handling the empty `_handle` case. In case of `null` `_handle` we should send just a plain text message as passed it was passed to `.send()` and ignore the handle, letting users handle such cases themselves instead of throwing the error at runtime. fix #5469
-rw-r--r--lib/child_process.js11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/child_process.js b/lib/child_process.js
index eec031333..e93e5d47c 100644
--- a/lib/child_process.js
+++ b/lib/child_process.js
@@ -111,6 +111,9 @@ var handleConversion = {
'net.Socket': {
send: function(message, socket) {
+ if (!socket._handle)
+ return;
+
// if the socket was created by net.Server
if (socket.server) {
// the slave should keep track of the socket
@@ -139,7 +142,8 @@ var handleConversion = {
postSend: function(handle) {
// Close the Socket handle after sending it
- handle.close();
+ if (handle)
+ handle.close();
},
got: function(message, handle, emit) {
@@ -438,6 +442,11 @@ function setupChannel(target, channel) {
// convert TCP object to native handle object
handle = handleConversion[message.type].send.apply(target, arguments);
+ // If handle was sent twice, or it is impossible to get native handle
+ // out of it - just send a text without the handle.
+ if (!handle)
+ message = message.msg;
+
// Update simultaneous accepts on Windows
if (obj.simultaneousAccepts) {
net._setSimultaneousAccepts(handle);