aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/path.cc37
-rw-r--r--winsup/cygwin/release/3.3.45
2 files changed, 41 insertions, 1 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index baf04ce..eb12558 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -3492,10 +3492,45 @@ restart:
{
UNICODE_STRING fpath;
- RtlInitCountedUnicodeString (&fpath, fpbuf, ret * sizeof (WCHAR));
+ /* If incoming path has no trailing backslash, but final path
+ has one, drop trailing backslash from final path so the
+ below string comparison has a chance to succeed. */
+ if (upath.Buffer[(upath.Length - 1) / sizeof (WCHAR)] != L'\\'
+ && fpbuf[ret - 1] == L'\\')
+ fpbuf[--ret] = L'\0';
fpbuf[1] = L'?'; /* \\?\ --> \??\ */
+ RtlInitCountedUnicodeString (&fpath, fpbuf, ret * sizeof (WCHAR));
if (!RtlEqualUnicodeString (&upath, &fpath, !!ci_flag))
{
+ /* Check if the final path is an UNC path and the incoming
+ path isn't. If so... */
+ if (RtlEqualUnicodePathPrefix (&fpath, &ro_u_uncp, TRUE)
+ && !RtlEqualUnicodePathPrefix (&upath, &ro_u_uncp, TRUE))
+ {
+ /* ...get the remote path from the volume path name,
+ replace remote path with drive letter, check again. */
+ WCHAR remote[MAX_PATH];
+
+ fpbuf[1] = L'\\';
+ BOOL r = GetVolumePathNameW (fpbuf, remote, MAX_PATH);
+ fpbuf[1] = L'?';
+ if (r)
+ {
+ int remlen = wcslen (remote);
+ if (remote[remlen - 1] == L'\\')
+ remlen--;
+ /* Hackfest */
+ fpath.Buffer[4] = upath.Buffer[4]; /* Drive letter */
+ fpath.Buffer[5] = L':';
+ WCHAR *to = fpath.Buffer + 6;
+ WCHAR *from = to + remlen - 6;
+ memmove (to, from,
+ (wcslen (from) + 1) * sizeof (WCHAR));
+ fpath.Length -= (from - to) * sizeof (WCHAR);
+ if (RtlEqualUnicodeString (&upath, &fpath, !!ci_flag))
+ goto file_not_symlink;
+ }
+ }
issymlink = true;
/* upath.Buffer is big enough and unused from this point on.
Reuse it here, avoiding yet another buffer allocation. */
diff --git a/winsup/cygwin/release/3.3.4 b/winsup/cygwin/release/3.3.4
index f1c32a1..4cbfba8 100644
--- a/winsup/cygwin/release/3.3.4
+++ b/winsup/cygwin/release/3.3.4
@@ -4,3 +4,8 @@ Bug Fixes
- Fix a bug in fhandler_dev_clipboard::read() that the second read
fails with 'Bad address'.
Addresses: https://cygwin.com/pipermail/cygwin/2021-December/250141.html
+
+- Convert UNC path prefix back to drive letter in symlink_info::check().
+ This solves the following issues:
+ Addresses: https://cygwin.com/pipermail/cygwin/2021-November/250087.html
+ https://cygwin.com/pipermail/cygwin/2021-December/250103.html