Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2008-04-25 20:50:29 +0400
committerCorinna Vinschen <corinna@vinschen.de>2008-04-25 20:50:29 +0400
commit703a42b96af53fce8747161effec026b085702ba (patch)
treeb621df90a76e6521721e0f46aa1d8f3110ec797f /winsup/cygwin/fhandler.cc
parent0dcfc3346a933ed3bbfc1947a31de68241b99ba0 (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.cc20
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. */