From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7868) id A60C63858D3C; Wed, 8 Dec 2021 11:55:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A60C63858D3C Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Takashi Yano To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin/cygwin-3_3-branch] Cygwin: path: Convert UNC path prefix back to drive letter. X-Act-Checkin: newlib-cygwin X-Git-Author: Takashi Yano X-Git-Refname: refs/heads/cygwin-3_3-branch X-Git-Oldrev: 2d95c753da8a91e5c4c194816a22b80aae835f22 X-Git-Newrev: 1b40f151cd5ad86241e98fe3b60d4700f04bfb99 Message-Id: <20211208115532.A60C63858D3C@sourceware.org> Date: Wed, 8 Dec 2021 11:55:32 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Dec 2021 11:55:32 -0000 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=1b40f151cd5ad86241e98fe3b60d4700f04bfb99 commit 1b40f151cd5ad86241e98fe3b60d4700f04bfb99 Author: Takashi Yano Date: Wed Dec 8 20:15:45 2021 +0900 Cygwin: path: Convert UNC path prefix back to drive letter. - When symlink_info::check() is called with the path having drive letter and UNC path is mounted to the drive, the path is replaced with UNC path. With this patch, UNC path prefix is converted back to drive letter. This fixes the issue: https://cygwin.com/pipermail/cygwin/2021-November/250087.html https://cygwin.com/pipermail/cygwin/2021-December/250103.html Diff: --- winsup/cygwin/path.cc | 37 ++++++++++++++++++++++++++++++++++++- winsup/cygwin/release/3.3.4 | 5 +++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index baf04ce89..eb1255849 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 f1c32a1a5..4cbfba8eb 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