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>
This commit is contained in:
Corinna Vinschen 2020-09-07 22:45:38 +02:00
parent 1f8e5847df
commit 8d0ff0768f
9 changed files with 16 additions and 16 deletions

View File

@ -14,10 +14,6 @@ details. */
#include <cygwin/_ucred.h> #include <cygwin/_ucred.h>
#include <sys/un.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 /* newlib used to define O_NDELAY differently from O_NONBLOCK. Now it
properly defines both to be the same. Unfortunately, we have to properly defines both to be the same. Unfortunately, we have to
behave properly the old version, too, to accommodate older executables. */ 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 filesize;
off_t position; off_t position;
int fileid; // unique within each class int fileid; // unique within each class
bool diropen;
public: public:
fhandler_virtual (); fhandler_virtual ();

View File

@ -1469,7 +1469,7 @@ fhandler_base::open_fs (int flags, mode_t mode)
bool new_file = !exists (); bool new_file = !exists ();
int res = fhandler_base::open (flags | O_DIROPEN, mode); int res = fhandler_base::open (flags, mode);
if (res) if (res)
{ {
/* The file info in pc is wrong at this point for newly created files. /* The file info in pc is wrong at this point for newly created files.

View File

@ -315,7 +315,7 @@ fhandler_proc::open (int flags, mode_t mode)
} }
else else
{ {
flags |= O_DIROPEN; diropen = true;
goto success; goto success;
} }
} }
@ -342,7 +342,7 @@ fhandler_proc::open (int flags, mode_t mode)
} }
else else
{ {
flags |= O_DIROPEN; diropen = true;
goto success; goto success;
} }
} }

View File

@ -272,7 +272,7 @@ fhandler_process::open (int flags, mode_t mode)
} }
else else
{ {
flags |= O_DIROPEN; diropen = true;
goto success; goto success;
} }
} }
@ -287,7 +287,7 @@ fhandler_process::open (int flags, mode_t mode)
} }
if (entry->fhandler == FH_PROCESSFD) if (entry->fhandler == FH_PROCESSFD)
{ {
flags |= O_DIROPEN; diropen = true;
goto success; goto success;
} }
if (flags & O_WRONLY) if (flags & O_WRONLY)

View File

@ -141,7 +141,7 @@ fhandler_procnet::open (int flags, mode_t mode)
} }
else else
{ {
flags |= O_DIROPEN; diropen = true;
goto success; goto success;
} }
} }

View File

@ -161,7 +161,7 @@ fhandler_procsysvipc::open (int flags, mode_t mode)
} }
else else
{ {
flags |= O_DIROPEN; diropen = true;
goto success; goto success;
} }
} }

View File

@ -784,7 +784,7 @@ fhandler_registry::open (int flags, mode_t mode)
} }
else else
{ {
flags |= O_DIROPEN; diropen = true;
/* Marking as nohandle allows to call dup. */ /* Marking as nohandle allows to call dup. */
nohandle (true); nohandle (true);
goto success; goto success;
@ -824,7 +824,7 @@ fhandler_registry::open (int flags, mode_t mode)
handles. */ handles. */
if (get_handle () >= HKEY_CLASSES_ROOT) if (get_handle () >= HKEY_CLASSES_ROOT)
nohandle (true); nohandle (true);
flags |= O_DIROPEN; diropen = true;
goto success; goto success;
} }
} }
@ -872,13 +872,13 @@ fhandler_registry::open (int flags, mode_t mode)
} }
} }
else else
flags |= O_DIROPEN; diropen = true;
set_handle (handle); set_handle (handle);
set_close_on_exec (!!(flags & O_CLOEXEC)); set_close_on_exec (!!(flags & O_CLOEXEC));
value_name = cwcsdup (dec_file); value_name = cwcsdup (dec_file);
if (!(flags & O_DIROPEN) && !fill_filebuf ()) if (!diropen && !fill_filebuf ())
{ {
RegCloseKey (handle); RegCloseKey (handle);
res = 0; res = 0;

View File

@ -182,7 +182,7 @@ fhandler_virtual::read (void *ptr, size_t& len)
{ {
if (len == 0) if (len == 0)
return; return;
if (openflags & O_DIROPEN) if (diropen)
{ {
set_errno (EISDIR); set_errno (EISDIR);
len = (size_t) -1; len = (size_t) -1;

View File

@ -30,3 +30,6 @@ Bug Fixes
- Fix SEGV in modfl call. - Fix SEGV in modfl call.
Addresses: https://cygwin.com/pipermail/cygwin/2020-August/246056.html 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