diff options
author | Fedor Indutny <fedor.indutny@gmail.com> | 2014-02-26 14:37:13 +0400 |
---|---|---|
committer | Timothy J Fontaine <tjfontaine@gmail.com> | 2014-03-05 09:36:35 -0800 |
commit | 5e06ce4fb949ab9bd5a7105dc0e8d924fd911d0c (patch) | |
tree | ecd1e78c5395812c6888cea273f252487052aecd | |
parent | a9d24fa40d2e02860efa7653164c0c4e0d515457 (diff) | |
download | node-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.js | 11 |
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); |