Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2013-04-12 12:30:47 +0400
committerCorinna Vinschen <corinna@vinschen.de>2013-04-12 12:30:47 +0400
commit492ee4ee4b3afe434279078b2796c7233a55a256 (patch)
tree03d115b4021e7ab990afb8cb7d184b577cd6cdc5
parent8f81761b6997db261137b8f02c8a838b6e5bb15b (diff)
* 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.
-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 b6b81eb03..b2a08f420 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 4d3161922..cfda6bb27 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -2653,26 +2653,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);
}
}