diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2008-04-25 20:50:29 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2008-04-25 20:50:29 +0400 |
commit | 703a42b96af53fce8747161effec026b085702ba (patch) | |
tree | b621df90a76e6521721e0f46aa1d8f3110ec797f /winsup/cygwin/fhandler.cc | |
parent | 0dcfc3346a933ed3bbfc1947a31de68241b99ba0 (diff) |
* fhandler.cc (fhandler_base::open): *Only* handle SYSTEM and HIDDEN
attributes in FILE_OVERWRITE case.
Diffstat (limited to 'winsup/cygwin/fhandler.cc')
-rw-r--r-- | winsup/cygwin/fhandler.cc | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index 7acbfb17a..bac2618e2 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -539,24 +539,26 @@ fhandler_base::open (int flags, mode_t mode) if (get_device () == FH_FS) { + file_attributes = FILE_ATTRIBUTE_NORMAL; /* Add the reparse point flag to native symlinks, otherwise we open the target, not the symlink. This would break lstat. */ if (pc.is_rep_symlink ()) create_options |= FILE_OPEN_REPARSE_POINT; - if ((flags & O_CREAT) || create_disposition == FILE_OVERWRITE) + /* Starting with Windows 2000, when trying to overwrite an already + existing file with FILE_ATTRIBUTE_HIDDEN and/or FILE_ATTRIBUTE_SYSTEM + attribute set, CreateFile fails with ERROR_ACCESS_DENIED. + Per MSDN you have to create the file with the same attributes as + already specified for the file. */ + if (((flags & O_CREAT) || create_disposition == FILE_OVERWRITE) + && has_attribute (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) + file_attributes |= pc.file_attributes (); + + if (flags & O_CREAT) { - file_attributes = FILE_ATTRIBUTE_NORMAL; /* If mode has no write bits set, we set the R/O attribute. */ if (!(mode & (S_IWUSR | S_IWGRP | S_IWOTH))) file_attributes |= FILE_ATTRIBUTE_READONLY; - /* Starting with Windows 2000, when trying to overwrite an already - existing file with FILE_ATTRIBUTE_HIDDEN and/or FILE_ATTRIBUTE_SYSTEM - attribute set, CreateFile fails with ERROR_ACCESS_DENIED. - Per MSDN you have to create the file with the same attributes as - already specified for the file. */ - if (has_attribute (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) - file_attributes |= pc.file_attributes (); /* If the file should actually be created and ntsec is on, set files attributes. */ |