Browse Source

child_process: fix assertion error in spawnSync

When ExitCallback was not called with an error such as ENOENT in
uv_spawn, the process handle still remains refed and needs to be closed.

Signed-off-by: Timothy J Fontaine <tjfontaine@gmail.com>
v0.11.13-release
Shigeki Ohtsu 11 years ago
committed by Timothy J Fontaine
parent
commit
ab7a3d098d
  1. 5
      src/spawn_sync.cc
  2. 4
      test/simple/test-child-process-spawnsync.js

5
src/spawn_sync.cc

@ -511,6 +511,11 @@ void SyncProcessRunner::CloseHandlesAndDeleteLoop() {
if (uv_loop_ != NULL) {
CloseStdioPipes();
CloseKillTimer();
// Close the process handle when ExitCallback was not called.
uv_handle_t* uv_process_handle =
reinterpret_cast<uv_handle_t*>(&uv_process_);
if (!uv_is_closing(uv_process_handle))
uv_close(uv_process_handle, NULL);
// Give closing watchers a chance to finish closing and get their close
// callbacks called.

4
test/simple/test-child-process-spawnsync.js

@ -39,6 +39,10 @@ console.log('sleep started');
var ret = spawnSync('sleep', ['1']);
console.log('sleep exited');
// Error test when command does not exist
var ret_err = spawnSync('command_does_not_exist');
assert.strictEqual(ret_err.error.code, 'ENOENT');
process.on('exit', function() {
assert.strictEqual(ret.status, 0);

Loading…
Cancel
Save