Hi Takashi, On Mar 14 19:57, Takashi Yano wrote: > - If UNC path for DFS is mounted to a drive with drive letter, the > error "Too many levels of symbolic links" occurs when accessing > to that drive. This is because GetDosDeviceW() returns unexpected > string such as "\Device\Mup\DfsClient\;Z:000000000003fb89\dfsserver > \dfs\linkname" for the mounted UNC path "\??\UNC\fileserver\share". > This patch adds a workaround for this issue. > > Addresses: https://cygwin.com/pipermail/cygwin/2022-March/250979.html > --- > winsup/cygwin/path.cc | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) > > diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc > index 4ad4e0821..dd8f6c043 100644 > --- a/winsup/cygwin/path.cc > +++ b/winsup/cygwin/path.cc > @@ -3527,7 +3527,7 @@ restart: > int remlen = QueryDosDeviceW (drive, remote, MAX_PATH); > if (remlen < 3) > goto file_not_symlink; /* fallback */ > - remlen -= 2; > + remlen -= 2; /* Two L'\0' */ > > if (remote[remlen - 1] == L'\\') > remlen--; > @@ -3535,20 +3535,27 @@ restart: > UNICODE_STRING rpath; > RtlInitCountedUnicodeString (&rpath, remote, > remlen * sizeof (WCHAR)); > + const int uncp_len =
I'd still prefer an unsigned type as USHORT or size_t here. USHORT because that's the type of the UNICODE_STRING::Length member, or size_t because that's the standard type used for string lengths. With that, GTG. I just notice that remlen is int, too. Given it represents the return value from QueryDosDeviceW, it should ideally be converted to DWORD. Thanks, Corinna