Skip to content

Commit a0a67a0

Browse files
committed
fix: guard process.kill against already-dead processes
When a process exits via signal (e.g., segfault, kill $$), exitCode is null but signalCode is set. Check both before calling kill() to avoid ESRCH errors. Also wrap kill() in try/catch as an additional safeguard for TOCTOU race where process exits between check and kill call.
1 parent 17131b7 commit a0a67a0

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

src/utils/disposableExec.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,14 @@ export class DisposableProcess implements Disposable {
6060
this.disposed = true;
6161

6262
// Kill process if still running
63-
if (!this.process.killed && this.process.exitCode === null) {
64-
this.process.kill("SIGKILL");
63+
// Check both exitCode and signalCode to avoid calling kill() on already-dead processes
64+
// When a process exits via signal (e.g., segfault, kill $$), exitCode is null but signalCode is set
65+
if (!this.process.killed && this.process.exitCode === null && this.process.signalCode === null) {
66+
try {
67+
this.process.kill("SIGKILL");
68+
} catch {
69+
// Ignore ESRCH errors - process may have exited between check and kill
70+
}
6571
}
6672

6773
// Run all cleanup callbacks

0 commit comments

Comments
 (0)