From 3eaa41f528b133d1fd9b4fc936605b8095532c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20A=C3=A7acak?= Date: Thu, 24 Oct 2024 14:08:50 +0300 Subject: [PATCH] src: fix kill signal on Windows Fixes: https://github.com/nodejs/node/issues/42923 --- doc/api/child_process.md | 4 +-- src/process_wrap.cc | 6 ++++ test/parallel/test-child-process-kill.js | 38 ++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/doc/api/child_process.md b/doc/api/child_process.md index f70d96a3395300..aafe7f369dcbbc 100644 --- a/doc/api/child_process.md +++ b/doc/api/child_process.md @@ -1698,8 +1698,8 @@ may not actually terminate the process. See kill(2) for reference. On Windows, where POSIX signals do not exist, the `signal` argument will be -ignored, and the process will be killed forcefully and abruptly (similar to -`'SIGKILL'`). +ignored except `'SIGKILL'`, `'SIGTERM'`, `'SIGINT'` and `'SIGQUIT'`, and the +process will be killed forcefully and abruptly (similar to `'SIGKILL'`). See [Signal Events][] for more details. On Linux, child processes of child processes will not be terminated diff --git a/src/process_wrap.cc b/src/process_wrap.cc index 556dea18eca76f..74f46bcb651bef 100644 --- a/src/process_wrap.cc +++ b/src/process_wrap.cc @@ -312,6 +312,12 @@ class ProcessWrap : public HandleWrap { ProcessWrap* wrap; ASSIGN_OR_RETURN_UNWRAP(&wrap, args.This()); int signal = args[0]->Int32Value(env->context()).FromJust(); +#ifdef _WIN32 + if (signal != SIGKILL && signal != SIGTERM && signal != SIGINT && + signal != SIGQUIT) { + signal = SIGKILL; + } +#endif int err = uv_process_kill(&wrap->process_, signal); args.GetReturnValue().Set(err); } diff --git a/test/parallel/test-child-process-kill.js b/test/parallel/test-child-process-kill.js index 1025c69ba1ac28..d5563e70e0976d 100644 --- a/test/parallel/test-child-process-kill.js +++ b/test/parallel/test-child-process-kill.js @@ -39,3 +39,41 @@ assert.strictEqual(cat.signalCode, null); assert.strictEqual(cat.killed, false); cat.kill(); assert.strictEqual(cat.killed, true); + +/* Test different types of kill signals on Windows */ +if (common.isWindows) { + const process1 = spawn('cmd'); + process1.on('exit', (code, signal) => { + assert.strictEqual(code, null); + assert.strictEqual(signal, 'SIGTERM'); + }); + process1.kill('SIGTERM'); + + const process2 = spawn('cmd'); + process2.on('exit', (code, signal) => { + assert.strictEqual(code, null); + assert.strictEqual(signal, 'SIGKILL'); + }); + process2.kill('SIGKILL'); + + const process3 = spawn('cmd'); + process3.on('exit', (code, signal) => { + assert.strictEqual(code, null); + assert.strictEqual(signal, 'SIGQUIT'); + }); + process3.kill('SIGQUIT'); + + const process4 = spawn('cmd'); + process4.on('exit', (code, signal) => { + assert.strictEqual(code, null); + assert.strictEqual(signal, 'SIGINT'); + }); + process4.kill('SIGINT'); + + const process5 = spawn('cmd'); + process5.on('exit', (code, signal) => { + assert.strictEqual(code, null); + assert.strictEqual(signal, 'SIGKILL'); + }); + process5.kill('SIGHUP'); +}