From: Shigeki Ohtsu Date: Mon, 21 Apr 2014 16:26:11 +0000 (+0900) Subject: child_process: fix assertion error in spawnSync X-Git-Tag: v0.11.13~8 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ab7a3d098ddb13967014c723333c1df730da4940;p=platform%2Fupstream%2Fnodejs.git 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 --- diff --git a/src/spawn_sync.cc b/src/spawn_sync.cc index 481d0ef..29de686 100644 --- a/src/spawn_sync.cc +++ b/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_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. diff --git a/test/simple/test-child-process-spawnsync.js b/test/simple/test-child-process-spawnsync.js index f192001..e3304dc 100644 --- a/test/simple/test-child-process-spawnsync.js +++ b/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);