From 26cf06ed9f5c0ffa42afff3dbe29533ddcb2fbf7 Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Wed, 20 Dec 2023 07:55:09 +0530 Subject: fix(node): child_process kill cancel pending IPC reads (#21647) --- cli/tests/unit_node/child_process_test.ts | 23 +++++++++++++++++++++++ ext/node/polyfills/internal/child_process.ts | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/cli/tests/unit_node/child_process_test.ts b/cli/tests/unit_node/child_process_test.ts index 79617cf3d..421e66dfd 100644 --- a/cli/tests/unit_node/child_process_test.ts +++ b/cli/tests/unit_node/child_process_test.ts @@ -731,3 +731,26 @@ Deno.test(function spawnSyncExitNonZero() { assertEquals(ret.status, 22); }); + +// https://github.com/denoland/deno/issues/21630 +Deno.test(async function forkIpcKillDoesNotHang() { + const testdataDir = path.join( + path.dirname(path.fromFileUrl(import.meta.url)), + "testdata", + ); + const script = path.join( + testdataDir, + "node_modules", + "foo", + "index.js", + ); + const p = Promise.withResolvers(); + const cp = CP.fork(script, [], { + cwd: testdataDir, + stdio: ["inherit", "inherit", "inherit", "ipc"], + }); + cp.on("close", () => p.resolve()); + cp.kill(); + + await p.promise; +}); diff --git a/ext/node/polyfills/internal/child_process.ts b/ext/node/polyfills/internal/child_process.ts index 0e93e22d3..39c7633e4 100644 --- a/ext/node/polyfills/internal/child_process.ts +++ b/ext/node/polyfills/internal/child_process.ts @@ -296,6 +296,10 @@ export class ChildProcess extends EventEmitter { throw err; } } + + /* Cancel any pending IPC I/O */ + this.disconnect?.(); + this.killed = true; this.signalCode = denoSignal; return this.killed; -- cgit v1.2.3