From eef77f7c065e35cfac9e782a646c6e1b4b4c67c1 Mon Sep 17 00:00:00 2001 From: longlong yan Date: Wed, 2 Sep 2026 10:39:13 +0800 Subject: [PATCH] tools/firewire: nosy-dump: fix input file handle leak 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 Link: https://lore.kernel.org/r/20260902023914.959-1-yanlonglong@kylinos.cn Signed-off-by: Takashi Sakamoto --- 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);