Hello, we've noticed that mkdir returns 0 for already existed directories (which was not expected behaviour), patch attached below.
# currently: $ (./toybox mkdir d; ./toybox mkdir d); echo $?; ./toybox rmdir d 0 # expected: $ (mkdir d; mkdir d); echo $?; rmdir d mkdir: cannot create directory ādā: File exists 1 # patched: $ (./toybox mkdir d; ./toybox mkdir d); echo $?; ./toybox rmdir d mkdir: 'd': File exists 1 -- Mikhail K.
>From d879d653c632ddfb2aa2b90b7a808df236ee2a22 Mon Sep 17 00:00:00 2001 From: Mikhail Kashkarov <m.kashka...@samsung.com> Date: Mon, 18 Oct 2021 18:52:29 +0300 Subject: [PATCH] mkdir: return error for existing directories without -p flag Existing directories should be ignored without errors only with -p flag (according to POSIX). Signed-off-by: Mikhail Kashkarov <m.kashka...@samsung.com> --- lib/lib.c | 3 ++- tests/mkdir.test | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/lib.c b/lib/lib.c index 0c1b5c37..7af44173 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -178,7 +178,8 @@ int mkpathat(int atfd, char *dir, mode_t lastmode, int flags) // test for. Might as well do it up front. if (!fstatat(atfd, dir, &buf, 0)) { - if ((flags&MKPATHAT_MKLAST) && !S_ISDIR(buf.st_mode)) { + // Note that mkdir should return EEXIST for already existed directory/file. + if (!(flags&MKPATHAT_MAKE) || ((flags&MKPATHAT_MKLAST) && !S_ISDIR(buf.st_mode))) { errno = EEXIST; return 1; } else return 0; diff --git a/tests/mkdir.test b/tests/mkdir.test index e1bdb887..dfee03ce 100755 --- a/tests/mkdir.test +++ b/tests/mkdir.test @@ -8,10 +8,15 @@ testing "mkdir" "mkdir one && [ -d one ] && echo yes" "yes\n" "" "" rmdir one touch existing -testing "existing" \ +testing "existing file" \ "mkdir existing 2> /dev/null || [ -f existing ] && echo yes" "yes\n" "" "" rm existing +mkdir existing +testing "existing dir" \ + "mkdir existing 2> /dev/null || echo yes" "yes\n" "" "" +rmdir existing + testing "one two" \ "mkdir one two && [ -d one ] && [ -d two ] && echo yes" "yes\n" "" "" rmdir one two -- 2.33.0
_______________________________________________ Toybox mailing list Toybox@lists.landley.net http://lists.landley.net/listinfo.cgi/toybox-landley.net