From 6337d0d6895e78e14b43448ff5f0c25f82bc3db2 Mon Sep 17 00:00:00 2001 From: Dennis-SEG Date: Sat, 24 Jan 2026 23:04:10 +0100 Subject: [PATCH] fix: prevent race condition in file node stream error handling When file stream is reused for static filenames, the global error handler had stale references to old msg and done from when the stream was created. Fix: Add per-write error handler with a writeDone flag to ensure done() is only called once, either on successful write or on error. Fixes: Dennis-SEG/node-red#5 --- .../@node-red/nodes/core/storage/10-file.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/storage/10-file.js b/packages/node_modules/@node-red/nodes/core/storage/10-file.js index 5cff2b6316..672c04ef26 100644 --- a/packages/node_modules/@node-red/nodes/core/storage/10-file.js +++ b/packages/node_modules/@node-red/nodes/core/storage/10-file.js @@ -190,9 +190,23 @@ module.exports = function(RED) { } if (node.filenameType === "str" || node.filenameType === "env") { // Static filename - write and reuse the stream next time + var writeDone = false; + var handleWriteError = function(err) { + if (!writeDone) { + writeDone = true; + node.wstream.removeListener('error', handleWriteError); + node.error(RED._("file.errors.appendfail",{error:err.toString()}),msg); + done(); + } + }; + node.wstream.on('error', handleWriteError); node.wstream.write(buf, function() { - nodeSend(msg); - done(); + if (!writeDone) { + writeDone = true; + node.wstream.removeListener('error', handleWriteError); + nodeSend(msg); + done(); + } }); } else {