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

Reply via email to