[PATCH] tools/firewire: nosy-dump: fix input file handle leak

From: longlong yan

Date: Tue Sep 01 2026 - 22:40:54 EST


The input file handle opened via the --input option is leaked on
multiple exit paths:

1. When fopen() for the output file fails, the already-opened input
handle is not closed before returning.

2. When fread() reaches EOF while reading from the input file, the
main loop returns directly, bypassing the cleanup section entirely.

3. On normal exit (e.g., SIGINT), the cleanup section closes output
and fd but never closes input.

Fix this by closing the input handle on the output-fopen error path
and in the cleanup section, and by changing the fread EOF early return
to a break so that the cleanup section runs.

Signed-off-by: longlong yan <yanlonglong@xxxxxxxxxx>
---
tools/firewire/nosy-dump.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/tools/firewire/nosy-dump.c b/tools/firewire/nosy-dump.c
index 9cc8626a7e94..7ddb50521c29 100644
--- a/tools/firewire/nosy-dump.c
+++ b/tools/firewire/nosy-dump.c
@@ -947,6 +947,8 @@ int main(int argc, const char *argv[])
output = fopen(option_output, "w");
if (output == NULL) {
fprintf(stderr, "Could not open %s, %m\n", option_output);
+ if (input != NULL)
+ fclose(input);
return -1;
}
}
@@ -973,7 +975,7 @@ int main(int argc, const char *argv[])
while (run) {
if (input != NULL) {
if (fread(&length, sizeof length, 1, input) != 1)
- return 0;
+ break;
fread(buf, 1, length, input);
} else {
poll(pollfds, 2, -1);
@@ -1014,6 +1016,9 @@ int main(int argc, const char *argv[])
if (output != NULL)
fclose(output);

+ if (input != NULL)
+ fclose(input);
+
if (fd >= 0)
close(fd);

--
2.45.2