From: Paul Eggert Date: Tue, 22 Jul 2025 19:12:22 +0000 (-0700) Subject: mkdir-p: ENOENT/ENOTDIR safety and consistency X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=84ddfc7bd29853ed91cdd65c7ce818072959f974;p=thirdparty%2Fgnulib.git mkdir-p: ENOENT/ENOTDIR safety and consistency * lib/mkdir-p.c (make_dir_parents): If mkdir fails with ENOENT or ENOTDIR, do not attempt anything else since the file does not exist. Treat ENOENT and ENOTDIR consistently later, too. --- diff --git a/ChangeLog b/ChangeLog index 4841447b88..ac20d475da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2025-07-22 Paul Eggert + mkdir-p: ENOENT/ENOTDIR safety and consistency + * lib/mkdir-p.c (make_dir_parents): If mkdir fails with ENOENT or + ENOTDIR, do not attempt anything else since the file does not exist. + Treat ENOENT and ENOTDIR consistently later, too. + mkdir-p: better diagnostics Problem reported by Lauri Tirkkonen . * lib/mkdir-p.c (make_dir_parents): diff --git a/lib/mkdir-p.c b/lib/mkdir-p.c index fffa58b4eb..7b764f122d 100644 --- a/lib/mkdir-p.c +++ b/lib/mkdir-p.c @@ -144,11 +144,13 @@ make_dir_parents (char *dir, mkdir_mode = -1; } - if (preserve_existing) + if (mkdir_errno == ENOENT || mkdir_errno == ENOTDIR) + ; + else if (preserve_existing) { if (mkdir_errno == 0) return true; - if (mkdir_errno != ENOENT && make_ancestor) + if (make_ancestor) { struct stat st; if (stat (dir + prefix_len, &st) == 0) @@ -182,8 +184,7 @@ make_dir_parents (char *dir, return true; if (mkdir_errno == 0 - || (mkdir_errno != ENOENT && make_ancestor - && errno != ENOTDIR)) + || (make_ancestor && errno != ENOENT && errno != ENOTDIR)) { error (0, errno, _(keep_owner