Browse Source

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 <gibfahn@gmail.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
v6.x
Sam Roberts 8 years ago
committed by Myles Borins
parent
commit
210ae5607c
  1. 12
      test/sequential/test-child-process-pass-fd.js

12
test/sequential/test-child-process-pass-fd.js

@ -39,15 +39,23 @@ if (process.argv[2] !== 'child') {
process.send('handle', socket); 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) => { const server = net.createServer((c) => {
process.once('message', function(msg) { process.once('message', function(msg) {
assert.strictEqual(msg, 'got'); assert.strictEqual(msg, 'got');
c.end('hello'); c.end('hello');
}); });
socketConnected(); socketConnected();
}); }).unref();
server.listen(0, common.localhostIPv4, () => { server.listen(0, common.localhostIPv4, () => {
const port = server.address().port; const port = server.address().port;
socket = net.connect(port, common.localhostIPv4, socketConnected); socket = net.connect(port, common.localhostIPv4, socketConnected).unref();
}); });
} }

Loading…
Cancel
Save