diff options
Diffstat (limited to 'winsup/cygwin/dir.cc')
-rw-r--r-- | winsup/cygwin/dir.cc | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc index 45fc011b9..022a8d663 100644 --- a/winsup/cygwin/dir.cc +++ b/winsup/cygwin/dir.cc @@ -305,6 +305,7 @@ extern "C" int mkdir (const char *dir, mode_t mode) { int res = -1; + SECURITY_ATTRIBUTES sa = sec_none_nih; path_conv real_dir (dir, PC_SYM_NOFOLLOW); @@ -318,10 +319,15 @@ mkdir (const char *dir, mode_t mode) if (! writable_directory (real_dir.get_win32 ())) goto done; - if (CreateDirectoryA (real_dir.get_win32 (), 0)) + if (allow_ntsec && real_dir.has_acls ()) + set_security_attribute (S_IFDIR | ((mode & 0777) & ~cygheap->umask), + &sa, alloca (256), 256); + + if (CreateDirectoryA (real_dir.get_win32 (), &sa)) { - set_file_attribute (real_dir.has_acls (), real_dir.get_win32 (), - S_IFDIR | ((mode & 0777) & ~cygheap->umask)); + if (!allow_ntsec && allow_ntea) + set_file_attribute (real_dir.has_acls (), real_dir.get_win32 (), + S_IFDIR | ((mode & 0777) & ~cygheap->umask)); res = 0; } else |