https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=b0c033bf3fae810b9e5a5c69f17bd4de63725691

commit b0c033bf3fae810b9e5a5c69f17bd4de63725691
Author: Ben Wijen <[email protected]>
Date:   Mon Jun 3 20:15:50 2019 +0200

    mkdir: always check-for-existence
    
    When using NtCreateFile when creating a directory that already exists,
    it will correctly return 'STATUS_OBJECT_NAME_COLLISION'.
    
    However using this function to create a directory (and all its parents)
    a normal use would be to start with mkdir(‘/cygdrive/c’) which 
translates
    to ‘C:\’ for which it'll instead return ‘STATUS_ACCESS_DENIED’.

Diff:
---
 winsup/cygwin/dir.cc | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc
index f43eae4..b757851 100644
--- a/winsup/cygwin/dir.cc
+++ b/winsup/cygwin/dir.cc
@@ -331,8 +331,10 @@ mkdir (const char *dir, mode_t mode)
          debug_printf ("got %d error from build_fh_name", fh->error ());
          set_errno (fh->error ());
        }
+      else if (fh->exists ())
+       set_errno (EEXIST);
       else if (has_dot_last_component (dir, true))
-       set_errno (fh->exists () ? EEXIST : ENOENT);
+       set_errno (ENOENT);
       else if (!fh->mkdir (mode))
        res = 0;
       delete fh;

Reply via email to