[newlib-cygwin/cygwin-3_6-branch] Cygwin: open: only fix up cached DOS file attributes for on-disk files

Takashi Yano tyan0@sourceware.org
Tue Apr 15 08:13:54 GMT 2025


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

commit 2d529bc42d36a75d1a677dbe99955951bb789d33
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
Date:   Mon Apr 14 20:49:29 2025 +0200

    Cygwin: open: only fix up cached DOS file attributes for on-disk files
    
    Don't try to change the file attributes for devices, e.g. /dev/null,
    this can lead to confusion later.
    
    Addresse: https://cygwin.com/pipermail/cygwin/2025-April/257940.html
    Fixes: 2d81f6ebe3dc ("Cygwin: open: always fix up cached DOS file attributes after NtCreateFile")
    Reported-by: Bruno Haible <bruno@clisp.org>
    Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
    (cherry picked from commit 37c49decc835f65af570a45fc6b8b4f9d9b05ba2)

Diff:
---
 winsup/cygwin/fhandler/base.cc | 49 ++++++++++++++++++++++--------------------
 winsup/cygwin/release/3.6.2    |  3 +++
 2 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/winsup/cygwin/fhandler/base.cc b/winsup/cygwin/fhandler/base.cc
index 32aca2c51..6c95e2b60 100644
--- a/winsup/cygwin/fhandler/base.cc
+++ b/winsup/cygwin/fhandler/base.cc
@@ -720,29 +720,32 @@ fhandler_base::open (int flags, mode_t mode)
 	goto done;
    }
 
-  /* Fix up file attributes, they are desperately needed later.
-
-     Originally we only did that in the FILE_CREATED case below, but that's
-     insufficient:
-
-     If two threads try to create the same file at the same time, it's
-     possible that path_conv::check returns the file as non-existant, i. e.,
-     pc.file_attributes () returns INVALID_FILE_ATTRIBUTES, 0xffffffff.
-     However, one of the NtCreateFile will beat the other, so only one of
-     them returns with FILE_CREATED.
-
-     The other fhandler_base::open() will instead run into the O_TRUNC
-     conditional (further below), blindly check for the SPARSE attribute
-     and remove that bit.  The result is that the attributes will be
-     0xfffffdff, i.e., everything but SPARSE.  Most annoying is that
-     pc.isdir() will return TRUE.  Hilarity ensues.
-
-     Note that we use a different IO_STATUS_BLOCK, so as not to overwrite
-     io.Information... */
-  if (!NT_SUCCESS (NtQueryInformationFile (fh, &io_bi, &fbi, sizeof fbi,
-					   FileBasicInformation)))
-    fbi.FileAttributes = file_attributes | FILE_ATTRIBUTE_ARCHIVE;
-  pc.file_attributes (fbi.FileAttributes);
+  if (get_device () == FH_FS)
+    {
+      /* Fix up file attributes, they are desperately needed later.
+
+	 Originally we only did that in the FILE_CREATED case below, but that's
+	 insufficient:
+
+	 If two threads try to create the same file at the same time, it's
+	 possible that path_conv::check returns the file as non-existant, i. e.,
+	 pc.file_attributes () returns INVALID_FILE_ATTRIBUTES, 0xffffffff.
+	 However, one of the NtCreateFile will beat the other, so only one of
+	 them returns with FILE_CREATED.
+
+	 The other fhandler_base::open() will instead run into the O_TRUNC
+	 conditional (further below), blindly check for the SPARSE attribute
+	 and remove that bit.  The result is that the attributes will be
+	 0xfffffdff, i.e., everything but SPARSE.  Most annoying is that
+	 pc.isdir() will return TRUE.  Hilarity ensues.
+
+	 Note that we use a different IO_STATUS_BLOCK, so as not to overwrite
+	 io.Information... */
+      if (!NT_SUCCESS (NtQueryInformationFile (fh, &io_bi, &fbi, sizeof fbi,
+					       FileBasicInformation)))
+	fbi.FileAttributes = file_attributes | FILE_ATTRIBUTE_ARCHIVE;
+      pc.file_attributes (fbi.FileAttributes);
+    }
 
   if (io.Information == FILE_CREATED)
     {
diff --git a/winsup/cygwin/release/3.6.2 b/winsup/cygwin/release/3.6.2
index f10a947cd..bceabcab3 100644
--- a/winsup/cygwin/release/3.6.2
+++ b/winsup/cygwin/release/3.6.2
@@ -10,3 +10,6 @@ Fixes:
 
 - Fix the console states after the console is closed.
   Addresses: https://cygwin.com/pipermail/cygwin/2025-April/257909.html
+
+- Fix setting DOS attributes on devices.
+  Addresse: https://cygwin.com/pipermail/cygwin/2025-April/257940.html


More information about the Cygwin-cvs mailing list