From 5f3e7925fe8d26e3c29358f24d6f0fb34dd77991 Mon Sep 17 00:00:00 2001 From: Mike McCready <66998419+MikeMcC399@users.noreply.github.com> Date: Tue, 18 Aug 2026 17:43:34 +0200 Subject: [PATCH] Revert "fs: fix close listener leak in FileHandle streams" This reverts commit 8488e1324af0631105cfaf365e0e2673de295696. It was advised that the fix in question is broken since it will unref the handle multiple times. Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com> --- lib/internal/fs/streams.js | 14 +------ .../test-fs-promises-file-handle-stream.js | 39 ------------------- 2 files changed, 1 insertion(+), 52 deletions(-) diff --git a/lib/internal/fs/streams.js b/lib/internal/fs/streams.js index 882aa8e71fc9..4c53f7ea23e1 100644 --- a/lib/internal/fs/streams.js +++ b/lib/internal/fs/streams.js @@ -158,19 +158,7 @@ function importFd(stream, options) { stream[kHandle] = options.fd; stream[kFs] = FileHandleOperations(stream[kHandle]); stream[kHandle][kRef](); - - const onclose = FunctionPrototypeBind(stream.close, stream); - options.fd.on('close', onclose); - if (options.autoClose === false) { - function cleanup() { - options.fd.removeListener('close', onclose); - options.fd[kUnref](); - } - stream.once('end', cleanup); - stream.once('finish', cleanup); - stream.once('error', cleanup); - } - + options.fd.on('close', FunctionPrototypeBind(stream.close, stream)); return options.fd.fd; } diff --git a/test/parallel/test-fs-promises-file-handle-stream.js b/test/parallel/test-fs-promises-file-handle-stream.js index 61d0b3ca2ec7..71f312b6f9d7 100644 --- a/test/parallel/test-fs-promises-file-handle-stream.js +++ b/test/parallel/test-fs-promises-file-handle-stream.js @@ -42,46 +42,7 @@ async function validateRead() { ); } -async function validateReusedCreateReadStream() { - const filePath = path.resolve(tmpDir, 'tmp-reused-stream.txt'); - fs.writeFileSync(filePath, Buffer.from('ab', 'utf8')); - - const fileHandle = await open(filePath, 'r'); - try { - await buffer(fileHandle.createReadStream({ - start: 0, - end: 0, - autoClose: false, - })); - assert.strictEqual(fileHandle.listenerCount('close'), 0); - - await buffer(fileHandle.createReadStream({ - start: 1, - end: 1, - autoClose: false, - })); - assert.strictEqual(fileHandle.listenerCount('close'), 0); - } finally { - await fileHandle.close(); - } -} - -async function validateReusedCreateWriteStream() { - const filePath = path.resolve(tmpDir, 'tmp-reused-write-stream.txt'); - const fileHandle = await open(filePath, 'w'); - try { - const stream = fileHandle.createWriteStream({ autoClose: false }); - stream.end('a'); - await finished(stream); - assert.strictEqual(fileHandle.listenerCount('close'), 0); - } finally { - await fileHandle.close(); - } -} - Promise.all([ validateWrite(), validateRead(), - validateReusedCreateReadStream(), - validateReusedCreateWriteStream(), ]).then(common.mustCall());