[newlib-cygwin] Cygwin: path_conv: decouple pathconv_flags from path_types
Corinna Vinschen
corinna@sourceware.org
Sun Jan 6 19:42:00 GMT 2019
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=fde4eaa105912625b6a78fba79d1fc39ee0fd201
commit fde4eaa105912625b6a78fba79d1fc39ee0fd201
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Sun Jan 6 14:29:53 2019 +0100
Cygwin: path_conv: decouple pathconv_flags from path_types
There's an unfortunate amalgamation of caller-provided pathconv_arg
flags with path_types flags which in turn are mostly mount flags.
This leads to a confusion of flag values in sylink_info::pflags and,
in turn, in path_conv::path_flags.
This patch decouples pathconv_flags from the other flags by making
sure that a pathconv_flag is never copied into a variable used for
path_types flags. Also, remove PATH_NO_ACCESS_CHECK since it's
not necessary.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/path.cc | 19 +++++++++++--------
winsup/cygwin/path.h | 3 ++-
2 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index b039801..28b9666 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -80,7 +80,8 @@ struct symlink_info
char contents[SYMLINK_MAX + 1];
char *ext_here;
int extn;
- unsigned pflags;
+ unsigned pflags; /* path flags, i.e. mount flags, special files, ... */
+ unsigned pc_flags; /* Relevant flags from caller of path_conv */
DWORD fileattr;
int issymlink;
bool ext_tacked_on;
@@ -735,9 +736,10 @@ path_conv::check (const char *src, unsigned opt,
int symlen = 0;
- for (unsigned pflags_or = opt & (PC_NO_ACCESS_CHECK | PC_KEEP_HANDLE);
+ /* Make sure to check certain flags on last component only. */
+ for (unsigned pc_flags = opt & (PC_NO_ACCESS_CHECK | PC_KEEP_HANDLE);
;
- pflags_or = 0)
+ pc_flags = 0)
{
const suffix_info *suff;
char *full_path;
@@ -764,7 +766,7 @@ path_conv::check (const char *src, unsigned opt,
if (error)
return;
- sym.pflags |= pflags_or;
+ sym.pc_flags = pc_flags;
if (!dev.exists ())
{
@@ -1190,7 +1192,7 @@ path_conv::check (const char *src, unsigned opt,
it will be figured out later by anything
which cares about this. */
}
- /* If the FS has been found to have unrelibale inodes, note
+ /* If the FS has been found to have unreliable inodes, note
that in path_flags. */
if (!fs.hasgood_inode ())
path_flags |= PATH_IHASH;
@@ -2721,7 +2723,8 @@ bool
symlink_info::set_error (int in_errno)
{
bool res;
- if (!(pflags & PATH_NO_ACCESS_CHECK) || in_errno == ENAMETOOLONG || in_errno == EIO)
+ if (!(pc_flags & PC_NO_ACCESS_CHECK)
+ || in_errno == ENAMETOOLONG || in_errno == EIO)
{
error = in_errno;
res = true;
@@ -3103,7 +3106,7 @@ restart:
The handle has been opened with the FILE_OPEN_REPARSE_POINT
flag, so it's a handle to the reparse point, not a handle
to the volumes root dir. */
- pflags &= ~PC_KEEP_HANDLE;
+ pc_flags &= ~PC_KEEP_HANDLE;
/* Volume mount point: The filesystem information for the top
level directory should be for the volume top level directory,
rather than for the reparse point itself. So we fetch the
@@ -3202,7 +3205,7 @@ restart:
if (h)
{
- if (pflags & PC_KEEP_HANDLE)
+ if (pc_flags & PC_KEEP_HANDLE)
conv_hdl.set (h);
else
NtClose (h);
diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h
index 9812699..297eaa6 100644
--- a/winsup/cygwin/path.h
+++ b/winsup/cygwin/path.h
@@ -39,6 +39,8 @@ struct suffix_info
extern suffix_info stat_suffixes[];
+/* DO NOT copy any of these files into the same set of flags as the
+ below path_types. Ever. */
enum pathconv_arg
{
PC_SYM_FOLLOW = 0x0001,
@@ -76,7 +78,6 @@ enum path_types
PATH_DOS = MOUNT_DOS,
PATH_IHASH = MOUNT_IHASH,
PATH_ALL_EXEC = (PATH_CYGWIN_EXEC | PATH_EXEC),
- PATH_NO_ACCESS_CHECK = PC_NO_ACCESS_CHECK,
PATH_CTTY = 0x00400000, /* could later be used as ctty */
PATH_OPEN = 0x00800000, /* use open semantics */
/* FIXME? PATH_OPEN collides with
More information about the Cygwin-cvs
mailing list