[newlib-cygwin] Cygwin: drop internal O_NOSYMLINK and O_DIROPEN flags

Corinna Vinschen corinna@sourceware.org
Mon Sep 7 20:46:21 GMT 2020


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

commit 8d0ff0768f6c948feb1d9383c494217f886e6b17
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Mon Sep 7 22:45:38 2020 +0200

    Cygwin: drop internal O_NOSYMLINK and O_DIROPEN flags
    
    Both flags are outdated and collide with official flags in
    sys/_default_fcntl.h, which may result in weird misbehaviour
    of file functions.
    
    O_NOSYMLINK is not used anyway.
    
    O_DIROPEN is used in fhandler_virtual and derived classes.
    The collision with O_NOFOLLOW results in spurious EISDIR
    errors when, e. g., reading files in the registry.
    fhandler_base::open_fs uses O_DIROPEN in the call to
    fhandler_base::open, but it's not used in this context
    further down the road.
    
    Drop both flags and create an alternative "diropen" bool
    flag in fhandler_virtual.
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/fhandler.h              | 5 +----
 winsup/cygwin/fhandler_disk_file.cc   | 2 +-
 winsup/cygwin/fhandler_proc.cc        | 4 ++--
 winsup/cygwin/fhandler_process.cc     | 4 ++--
 winsup/cygwin/fhandler_procnet.cc     | 2 +-
 winsup/cygwin/fhandler_procsysvipc.cc | 2 +-
 winsup/cygwin/fhandler_registry.cc    | 8 ++++----
 winsup/cygwin/fhandler_virtual.cc     | 2 +-
 winsup/cygwin/release/3.2.0           | 3 +++
 9 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index b4ba9428a..d7bd0ac06 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -14,10 +14,6 @@ details. */
 #include <cygwin/_ucred.h>
 #include <sys/un.h>
 
-/* fcntl flags used only internaly. */
-#define O_NOSYMLINK	0x080000
-#define O_DIROPEN	0x100000
-
 /* newlib used to define O_NDELAY differently from O_NONBLOCK.  Now it
    properly defines both to be the same.  Unfortunately, we have to
    behave properly the old version, too, to accommodate older executables. */
@@ -2634,6 +2630,7 @@ class fhandler_virtual : public fhandler_base
   off_t filesize;
   off_t position;
   int fileid; // unique within each class
+  bool diropen;
  public:
 
   fhandler_virtual ();
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index c37b3c504..885b59161 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -1469,7 +1469,7 @@ fhandler_base::open_fs (int flags, mode_t mode)
 
   bool new_file = !exists ();
 
-  int res = fhandler_base::open (flags | O_DIROPEN, mode);
+  int res = fhandler_base::open (flags, mode);
   if (res)
     {
       /* The file info in pc is wrong at this point for newly created files.
diff --git a/winsup/cygwin/fhandler_proc.cc b/winsup/cygwin/fhandler_proc.cc
index 9a20c23d4..196bafd18 100644
--- a/winsup/cygwin/fhandler_proc.cc
+++ b/winsup/cygwin/fhandler_proc.cc
@@ -315,7 +315,7 @@ fhandler_proc::open (int flags, mode_t mode)
 	}
       else
 	{
-	  flags |= O_DIROPEN;
+	  diropen = true;
 	  goto success;
 	}
     }
@@ -342,7 +342,7 @@ fhandler_proc::open (int flags, mode_t mode)
 	      }
 	    else
 	      {
-		flags |= O_DIROPEN;
+		diropen = true;
 		goto success;
 	      }
 	  }
diff --git a/winsup/cygwin/fhandler_process.cc b/winsup/cygwin/fhandler_process.cc
index e746b5b5c..a6c358217 100644
--- a/winsup/cygwin/fhandler_process.cc
+++ b/winsup/cygwin/fhandler_process.cc
@@ -272,7 +272,7 @@ fhandler_process::open (int flags, mode_t mode)
 	}
       else
 	{
-	  flags |= O_DIROPEN;
+	  diropen = true;
 	  goto success;
 	}
     }
@@ -287,7 +287,7 @@ fhandler_process::open (int flags, mode_t mode)
     }
   if (entry->fhandler == FH_PROCESSFD)
     {
-      flags |= O_DIROPEN;
+      diropen = true;
       goto success;
     }
   if (flags & O_WRONLY)
diff --git a/winsup/cygwin/fhandler_procnet.cc b/winsup/cygwin/fhandler_procnet.cc
index 2ea827c48..6df46220c 100644
--- a/winsup/cygwin/fhandler_procnet.cc
+++ b/winsup/cygwin/fhandler_procnet.cc
@@ -141,7 +141,7 @@ fhandler_procnet::open (int flags, mode_t mode)
 	}
       else
 	{
-	  flags |= O_DIROPEN;
+	  diropen = true;
 	  goto success;
 	}
     }
diff --git a/winsup/cygwin/fhandler_procsysvipc.cc b/winsup/cygwin/fhandler_procsysvipc.cc
index 6b4fd8889..516864388 100644
--- a/winsup/cygwin/fhandler_procsysvipc.cc
+++ b/winsup/cygwin/fhandler_procsysvipc.cc
@@ -161,7 +161,7 @@ fhandler_procsysvipc::open (int flags, mode_t mode)
 	}
       else
 	{
-	  flags |= O_DIROPEN;
+	  diropen = true;
 	  goto success;
 	}
     }
diff --git a/winsup/cygwin/fhandler_registry.cc b/winsup/cygwin/fhandler_registry.cc
index 5fc03fedd..5696a4904 100644
--- a/winsup/cygwin/fhandler_registry.cc
+++ b/winsup/cygwin/fhandler_registry.cc
@@ -784,7 +784,7 @@ fhandler_registry::open (int flags, mode_t mode)
 	}
       else
 	{
-	  flags |= O_DIROPEN;
+	  diropen = true;
 	  /* Marking as nohandle allows to call dup. */
 	  nohandle (true);
 	  goto success;
@@ -824,7 +824,7 @@ fhandler_registry::open (int flags, mode_t mode)
 		   handles. */
 		if (get_handle () >= HKEY_CLASSES_ROOT)
 		  nohandle (true);
-		flags |= O_DIROPEN;
+		diropen = true;
 		goto success;
 	      }
 	  }
@@ -872,13 +872,13 @@ fhandler_registry::open (int flags, mode_t mode)
 	    }
 	}
       else
-	flags |= O_DIROPEN;
+	diropen = true;
 
       set_handle (handle);
       set_close_on_exec (!!(flags & O_CLOEXEC));
       value_name = cwcsdup (dec_file);
 
-      if (!(flags & O_DIROPEN) && !fill_filebuf ())
+      if (!diropen && !fill_filebuf ())
 	{
 	  RegCloseKey (handle);
 	  res = 0;
diff --git a/winsup/cygwin/fhandler_virtual.cc b/winsup/cygwin/fhandler_virtual.cc
index 6169f3c81..b9ee31f76 100644
--- a/winsup/cygwin/fhandler_virtual.cc
+++ b/winsup/cygwin/fhandler_virtual.cc
@@ -182,7 +182,7 @@ fhandler_virtual::read (void *ptr, size_t& len)
 {
   if (len == 0)
     return;
-  if (openflags & O_DIROPEN)
+  if (diropen)
     {
       set_errno (EISDIR);
       len = (size_t) -1;
diff --git a/winsup/cygwin/release/3.2.0 b/winsup/cygwin/release/3.2.0
index 32cc4edec..6fdd1463a 100644
--- a/winsup/cygwin/release/3.2.0
+++ b/winsup/cygwin/release/3.2.0
@@ -30,3 +30,6 @@ Bug Fixes
 
 - Fix SEGV in modfl call.
   Addresses: https://cygwin.com/pipermail/cygwin/2020-August/246056.html
+
+- Fix a collision of offical and internally used file flags.
+  Addresses: https://cygwin.com/pipermail/cygwin/2020-September/246174.html


More information about the Cygwin-cvs mailing list