From 210ae5607c1c0d5eb30815a1782af9e474e74259 Mon Sep 17 00:00:00 2001 From: Sam Roberts Date: Mon, 24 Oct 2016 08:53:42 -0700 Subject: [PATCH] test: prevent workers outliving parent test-child-process-pass-fd.js parent can exit with an error on failure to fork, in which case it will leak child processes. Limit child lifetime to that of parent. Fixes: https://github.com/nodejs/node/issues/9255 PR-URL: https://github.com/nodejs/node/pull/9257 Reviewed-By: Gibson Fahnestock Reviewed-By: Michael Dawson Reviewed-By: James M Snell Reviewed-By: Colin Ihrig --- test/sequential/test-child-process-pass-fd.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/test/sequential/test-child-process-pass-fd.js b/test/sequential/test-child-process-pass-fd.js index c1d115f9a9..404ae854a1 100644 --- a/test/sequential/test-child-process-pass-fd.js +++ b/test/sequential/test-child-process-pass-fd.js @@ -39,15 +39,23 @@ if (process.argv[2] !== 'child') { process.send('handle', socket); } + // As a side-effect, listening for the message event will ref the IPC channel, + // so the child process will stay alive as long as it has a parent process/IPC + // channel. Once this is done, we can unref our client and server sockets, and + // the only thing keeping this worker alive will be IPC. This is important, + // because it means a worker with no parent will have no referenced handles, + // thus no work to do, and will exit immediately, preventing process leaks. + process.on('message', function() {}); + const server = net.createServer((c) => { process.once('message', function(msg) { assert.strictEqual(msg, 'got'); c.end('hello'); }); socketConnected(); - }); + }).unref(); server.listen(0, common.localhostIPv4, () => { const port = server.address().port; - socket = net.connect(port, common.localhostIPv4, socketConnected); + socket = net.connect(port, common.localhostIPv4, socketConnected).unref(); }); }