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 <yanlonglong@kylinos.cn>
Link: https://lore.kernel.org/r/20260902023914.959-1-yanlonglong@kylinos.cn
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
This commit is contained in:
longlong yan 2026-09-02 10:39:13 +08:00 committed by Takashi Sakamoto
parent 6899ac01c6
commit eef77f7c06

View File

@ -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);