From f0a0e3c6b3fd55d7a7cadf310ef4a443c56082b9 Mon Sep 17 00:00:00 2001 From: Benjamin Gruenbaum Date: Mon, 7 Dec 2020 12:54:50 +0200 Subject: child_process: clean event listener correctly I was working on AbortSignal for spawn and noticed there is a leak in the current code for AbortSignal support in child_process since it removes the wrong listener. I used the new signal as argument feature to make removing the listener easier and added a test. PR-URL: https://github.com/nodejs/node/pull/36424 Reviewed-By: Anna Henningsen Reviewed-By: Rich Trott --- lib/child_process.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'lib/child_process.js') diff --git a/lib/child_process.js b/lib/child_process.js index ae5a5f6587..29a6450210 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -378,14 +378,13 @@ function execFile(file /* , args, options, callback */) { if (options.signal.aborted) { process.nextTick(() => kill()); } else { + const childController = new AbortController(); options.signal.addEventListener('abort', () => { - if (!ex) { + if (!ex) ex = new AbortError(); - } kill(); - }); - const remove = () => options.signal.removeEventListener('abort', kill); - child.once('close', remove); + }, { signal: childController.signal }); + child.once('close', () => childController.abort()); } } -- cgit v1.2.3