aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2013-04-12 08:30:50 +0000
committerCorinna Vinschen <corinna@vinschen.de>2013-04-12 08:30:50 +0000
commitd673a86dc0a096b7af30a3ab1f7af21073dce407 (patch)
tree64083c68c5954115e31765a062dc078f1959880a
parenta695b548fb0c6ed2da30541bfeb61d31f52814cd (diff)
downloadnewlib-d673a86dc0a096b7af30a3ab1f7af21073dce407.zip
newlib-d673a86dc0a096b7af30a3ab1f7af21073dce407.tar.gz
newlib-d673a86dc0a096b7af30a3ab1f7af21073dce407.tar.bz2
Pull in changes from HEAD
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/path.cc30
2 files changed, 22 insertions, 14 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index b6b81eb..b2a08f4 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2013-04-12 Corinna Vinschen <corinna@vinschen.de>
+
+ * path.cc (symlink_info::check): Drop PC_KEEP_HANDLE flag for
+ unrecognized reparse points as well. Reorganize code and comments
+ handling reparse points for better readability.
+
2013-04-11 Corinna Vinschen <corinna@vinschen.de>
* hires.h (hires_ns::nsecs): Declare with bool parameter.
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 34230c0..80336a2 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -2667,26 +2667,28 @@ restart:
if ((fileattr & FILE_ATTRIBUTE_REPARSE_POINT))
{
res = check_reparse_point (h, fs.is_remote_drive ());
- if (res == -1)
+ if (res > 0)
{
- /* Volume mount point. The filesystem information for the top
+ /* A symlink is never a directory. */
+ conv_hdl.fnoi ()->FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY;
+ break;
+ }
+ else
+ {
+ /* Volume moint point or unrecognized reparse point type.
+ Make sure the open handle is not used in later stat calls.
+ 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;
+ /* 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
filesystem information again, but with a NULL handle.
This does what we want because fs_info::update opens the
handle without FILE_OPEN_REPARSE_POINT. */
- fs.update (&upath, NULL);
- /* Make sure the open handle is not used in later stat calls.
- 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;
- }
- else if (res)
- {
- /* A symlink is never a directory. */
- conv_hdl.fnoi ()->FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY;
- break;
+ if (res == -1)
+ fs.update (&upath, NULL);
}
}