From b374ee8c3dfcefe7b22060c1a2073ee07e4e1b8c Mon Sep 17 00:00:00 2001 From: cjihrig Date: Sun, 28 Aug 2016 12:35:13 -0400 Subject: [PATCH] src: add handle check to spawn_sync This commit verifies that the child process handle is of the correct type before trying to close it in CloseHandlesAndDeleteLoop(). This catches the case where input validation failed, and the child process was never actually spawned. Fixes: https://github.com/nodejs/node/issues/8096 Fixes: https://github.com/nodejs/node/issues/8539 Refs: https://github.com/nodejs/node/issues/9722 PR-URL: https://github.com/nodejs/node/pull/8312 Reviewed-By: Ben Noordhuis --- src/spawn_sync.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/spawn_sync.cc b/src/spawn_sync.cc index 79f10a0ea2594d..689f605e1446cd 100644 --- a/src/spawn_sync.cc +++ b/src/spawn_sync.cc @@ -501,7 +501,12 @@ void SyncProcessRunner::CloseHandlesAndDeleteLoop() { // 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)) + + // Close the process handle if it is still open. The handle type also + // needs to be checked because TryInitializeAndRunLoop() won't spawn a + // process if input validation fails. + if (uv_process_handle->type == UV_PROCESS && + !uv_is_closing(uv_process_handle)) uv_close(uv_process_handle, nullptr); // Give closing watchers a chance to finish closing and get their close