Hi Corinna, Please see the attachment for my patch. My MUA indeed replaced the tabs with spaces.
I did notice that the indentation was mixed tabs and spaces, but as stated on the website I have kept the surrounding indentation. Ben... On 04-06-2019 09:41, Corinna Vinschen wrote:
Hi Ben, On Jun 3 22:07, Ben wrote:When creating a directory which already exists, NtCreateFile will correctly return 'STATUS_OBJECT_NAME_COLLISION'. However when creating 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’. So we better check for existence prior to calling NtCreateFile. --- 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 f43eae461..b757851d5 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; -- 2.21.0I was just trying to apply your patch but it fails to apply cleanly. Can you please check your indentation? The `else' lines are indented more than the lines in between and TABs are missing. Maybe your MUA breaks the output? If all else fails, you could attach your patch as plain/text attachement to your mail, usually that's left alone by the MUA. Thanks, Corinna
>From 190b5bc9497a1332ce53afd831debe1ac3e53ffb Mon Sep 17 00:00:00 2001 From: Ben Wijen <[email protected]> Date: Mon, 3 Jun 2019 20:15:50 +0200 Subject: [PATCH] mkdir: always check-for-existence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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â. --- 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 f43eae461..b757851d5 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; -- 2.21.0
