summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-08-24 11:14:30 +0000
committerCorinna Vinschen <corinna@vinschen.de>2009-08-24 11:14:30 +0000
commit11788f8ce076b1be50b22aa91b8f1302641666cb (patch)
tree45627c3ca56deaa485af21ad14b228cccbef5ce5
parent84acd4c98908f2a54b20f07d3e18ff683708b7be (diff)
downloadcygnal-11788f8ce076b1be50b22aa91b8f1302641666cb.tar.gz
cygnal-11788f8ce076b1be50b22aa91b8f1302641666cb.tar.bz2
cygnal-11788f8ce076b1be50b22aa91b8f1302641666cb.zip
* globals.cc (ro_u_volume): New R/O unicode string.
* path.cc (symlink_info::check_reparse_point): Fix check for volume mount points to work on Vista and later as well.
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/globals.cc1
-rw-r--r--winsup/cygwin/path.cc11
3 files changed, 16 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index d5b6c73b0..fbfa72c11 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2009-08-24 Corinna Vinschen <corinna@vinschen.de>
+
+ * globals.cc (ro_u_volume): New R/O unicode string.
+ * path.cc (symlink_info::check_reparse_point): Fix check for volume
+ mount points to work on Vista and later as well.
+
2009-08-22 Corinna Vinschen <corinna@vinschen.de>
* strfuncs.cc (__set_charset_from_codepage): Add codepages 20866
diff --git a/winsup/cygwin/globals.cc b/winsup/cygwin/globals.cc
index b50bf8460..7a408bb84 100644
--- a/winsup/cygwin/globals.cc
+++ b/winsup/cygwin/globals.cc
@@ -100,6 +100,7 @@ UNICODE_STRING _RDATA ro_u_ntfs = _ROU (L"NTFS");
UNICODE_STRING _RDATA ro_u_sunwnfs = _ROU (L"SUNWNFS");
UNICODE_STRING _RDATA ro_u_udf = _ROU (L"UDF");
UNICODE_STRING _RDATA ro_u_unixfs = _ROU (L"UNIXFS");
+UNICODE_STRING _RDATA ro_u_volume = _ROU (L"\\??\\Volume{");
#undef _RDATA
#undef _ROU
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 4d5424c76..e6782f6e9 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -1865,9 +1865,16 @@ symlink_info::check_reparse_point (HANDLE h)
}
else if (rp->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT)
{
- if (rp->SymbolicLinkReparseBuffer.PrintNameLength == 0)
+ UNICODE_STRING subst;
+
+ RtlInitCountedUnicodeString (&subst,
+ (WCHAR *)((char *)rp->MountPointReparseBuffer.PathBuffer
+ + rp->MountPointReparseBuffer.SubstituteNameOffset),
+ rp->MountPointReparseBuffer.SubstituteNameLength);
+ if (rp->MountPointReparseBuffer.PrintNameLength == 0
+ || RtlEqualUnicodePathPrefix (&subst, &ro_u_volume, TRUE))
{
- /* Likely a volume mount point. Not treated as symlink. */
+ /* Volume mount point. Not treated as symlink. */
return 0;
}
sys_wcstombs (srcbuf, SYMLINK_MAX + 1,