From 11788f8ce076b1be50b22aa91b8f1302641666cb Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 24 Aug 2009 11:14:30 +0000 Subject: [PATCH] * 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. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/globals.cc | 1 + winsup/cygwin/path.cc | 11 +++++++++-- 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 + + * 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 * 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,