From 360e04fd5aa9db500535c74a0abd877cd7476650 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Mon, 18 Jan 2016 20:59:18 -0500 Subject: [PATCH] internal/child_process: call postSend on error Call `obj.postSend` in error case of `process.send()`. The `net.Socket`'s handle should not be leaked. Note that there are two callbacks invoked on handles when they are sent to the child process over IPC pipes. These callbacks are specified by `handleConversion` object, and during send two of them are invoked: * `send` * `postSend` Now for `net.Socket` in particular, `postSend` performs clean up by closing the actual uv handle. However this clean up will not happen in one of the branches. This pull request aims to fix this. PR-URL: https://github.com/nodejs/node/pull/4752 Reviewed-By: Ben Noordhuis Reviewed-By: James M Snell --- lib/internal/child_process.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/internal/child_process.js b/lib/internal/child_process.js index ce4cd6496fd1d2..a6f9ed9fa476fd 100644 --- a/lib/internal/child_process.js +++ b/lib/internal/child_process.js @@ -602,12 +602,18 @@ function setupChannel(target, channel) { } else { process.nextTick(function() { req.oncomplete(); }); } - } else if (!swallowErrors) { - const ex = errnoException(err, 'write'); - if (typeof callback === 'function') { - process.nextTick(callback, ex); - } else { - this.emit('error', ex); // FIXME(bnoordhuis) Defer to next tick. + } else { + // Cleanup handle on error + if (obj && obj.postSend) + obj.postSend(handle); + + if (!swallowErrors) { + const ex = errnoException(err, 'write'); + if (typeof callback === 'function') { + process.nextTick(callback, ex); + } else { + this.emit('error', ex); // FIXME(bnoordhuis) Defer to next tick. + } } }