vboxsharedfs - Too many levels of symbolic links
Corinna Vinschen
corinna-cygwin@cygwin.com
Mon Dec 6 10:16:30 GMT 2021
On Dec 5 11:54, Takashi Yano wrote:
> On Tue, 30 Nov 2021 19:04:57 +0200
> Oskar Skog wrote:
> > vboxsharedfs file systems no longer work. Any attempt to access will
> > result in "too many levels of symbolic links".
> >
> > This only affects the VirtualBox shared folder, the Samba share works
> > just fine.
> >
> > Last time I updated (before today) was sometime before the 10th of
> > September.
> >
> > MSYS2 has the same problem, but no one seems to have reported it to
> > Cygwin:
> > https://github.com/msys2/msys2-runtime/issues/58
> >
> >
> > user@DESKTOP-******* ~$ ls /cygdrive/z
> > ls: cannot access '/cygdrive/z': Too many levels of symbolic links
> > user@DESKTOP-******* ~$ mount
> > C:/Cygwin/bin on /usr/bin type ntfs (binary,auto)
> > C:/Cygwin/lib on /usr/lib type ntfs (binary,auto)
> > C:/Cygwin on / type ntfs (binary,auto)
> > C: on /cygdrive/c type ntfs (binary,posix=0,user,noumount,auto)
> > D: on /cygdrive/d type iso9660 (binary,posix=0,user,noumount,auto)
> > Y: on /cygdrive/y type smbfs (binary,posix=0,user,noumount,auto)
> > Z: on /cygdrive/z type vboxsharedfolderfs
> > (binary,posix=0,user,noumount,auto)
> > user@DESKTOP-******* ~$ uname -a
> > CYGWIN_NT-10.0 DESKTOP-* 3.3.2(0.341/5/3) 2021-11-08 16:55 x86_64 Cygwin
>
> Thanks for the report.
> It seems that this happens only in 64bit Windoes10/11.
> [...]
> I tested with VirtualBox version 6.1.30.
Thanks for testing, Takashi!
> In 64bit Windows10, for vbox shared path, GetFinalPathNameByHandleW()
> returns path with trailing '\'. As a result, RtlEqualUnicodeString()
> fails and tries to resolve symlink repeatedly.
That sounds like a bug in VirtualBox, but yeah, we should workaround it.
> For example, RtlEqualUnicodeString() compares \??\UNC\VBoxSrv\tmp and
> \??\UNC\VBoxSrv\tmp\, then it fails.
> [...]
> + if (wcsstr (fpbuf, L"\\\\?\\UNC\\") == fpbuf)
> + goto file_not_symlink;
> +
Isn't that a bit intrusive? Wouldn't it also fix the issue if we
just overwrite a trailing '\\' with '\0', like this?
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index baf04ce89a08..b76e5b0466cf 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -3492,8 +3492,14 @@ 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))
{
issymlink = true;
Thanks,
Corinna
More information about the Cygwin
mailing list