[PATCH master 1/4] commands: stat: fix leaking file descriptors on early exit
Ahmad Fatoum
a.fatoum at barebox.org
Sun Jun 22 23:20:29 PDT 2025
We currently leak the dirfd if we encounter an error during option
parsing. Fix this by only recording the path at first and opening the
dirfd once all options have been parsed.
Fixes: 5b175c52b53b ("commands: stat: add option for statat")
Signed-off-by: Ahmad Fatoum <a.fatoum at barebox.org>
---
commands/stat.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/commands/stat.c b/commands/stat.c
index 8a96bf77b0f1..581cefad871d 100644
--- a/commands/stat.c
+++ b/commands/stat.c
@@ -14,6 +14,7 @@ static int do_stat(int argc, char *argv[])
{
int (*statfn)(int dirfd, const char *, struct stat *) = lstatat;
int ret, opt, dirfd = AT_FDCWD, extra_flags = 0, exitcode = 0;
+ const char *dir = NULL;
char **filename;
struct stat st;
@@ -26,9 +27,7 @@ static int do_stat(int argc, char *argv[])
extra_flags |= O_CHROOT;
fallthrough;
case 'c':
- dirfd = open(optarg, O_PATH | O_DIRECTORY | extra_flags);
- if (dirfd < 0)
- return dirfd;
+ dir = optarg;
break;
default:
return COMMAND_ERROR_USAGE;
@@ -38,6 +37,12 @@ static int do_stat(int argc, char *argv[])
if (optind == argc)
return COMMAND_ERROR_USAGE;
+ if (dir) {
+ dirfd = open(dir, O_PATH | O_DIRECTORY | extra_flags);
+ if (dirfd < 0)
+ return dirfd;
+ }
+
for (filename = &argv[optind]; *filename; filename++) {
ret = statfn(dirfd, *filename, &st);
--
2.39.5
More information about the barebox
mailing list