From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from conssluserg-02.nifty.com (conssluserg-02.nifty.com [210.131.2.81]) by sourceware.org (Postfix) with ESMTPS id D682C3858D28 for ; Wed, 8 Dec 2021 08:20:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D682C3858D28 Authentication-Results: sourceware.org; dmarc=fail (p=none dis=none) header.from=nifty.ne.jp Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=nifty.ne.jp Received: from Express5800-S70 (z221123.dynamic.ppp.asahi-net.or.jp [110.4.221.123]) (authenticated) by conssluserg-02.nifty.com with ESMTP id 1B88K8Nl021148 for ; Wed, 8 Dec 2021 17:20:08 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conssluserg-02.nifty.com 1B88K8Nl021148 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.ne.jp; s=dec2015msa; t=1638951608; bh=GO4svNudtO/JiLTaZXr7KrcUFl8i0HiGYLT1MJViKSM=; h=Date:From:To:Subject:In-Reply-To:References:From; b=aMKjernJVsOP8rVJrE+Wn33CQJXYYJSZon9hdFTHHkbTOzwjOqbzQDp0sVk8YKkWs i/AHELk8NHVU6mPovlRU5B1RnXoMavB77UWr2rmHc/hhUpUXhEx/sqKelCOM3RLoYB N+j+72Oqkvi5uMId3nC3HSumgm6SAfFNQERiWAOlYsMs9J/7lI0H33saezkEJ94wNJ vPfhZFrX7XyeO5+XMqGGV3p8UulOpA58RizwdAJJHu2oT4HvLm/QcrtRZz+ySNZWyH xto0X5bXM6sboOfvPXZftqltNI4VP8gBoYTwdNLPK37XCGW0ZQkqmJWG5VmB94NPVB avPk+BQeqdFNg== X-Nifty-SrcIP: [110.4.221.123] Date: Wed, 8 Dec 2021 17:20:08 +0900 From: Takashi Yano To: cygwin@cygwin.com Subject: Re: vboxsharedfs - Too many levels of symbolic links Message-Id: <20211208172008.01b11239c374604abf638a19@nifty.ne.jp> In-Reply-To: References: X-Mailer: Sylpheed 3.7.0 (GTK+ 2.24.30; i686-pc-mingw32) Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Multipart=_Wed__8_Dec_2021_17_20_08_+0900_13n0sbfkwfBxj2Wa" X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: cygwin@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: General Cygwin discussions and problem reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Dec 2021 08:20:29 -0000 This is a multi-part message in MIME format. --Multipart=_Wed__8_Dec_2021_17_20_08_+0900_13n0sbfkwfBxj2Wa Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit On Tue, 7 Dec 2021 18:15:42 +0100 Corinna Vinschen wrote: > Hi Takashi, > > ----- Forwarded message from Corinna Vinschen ----- > > The idea of the GFPNBH call is to short-circuit the path_conv handling > > in case we have native Windows symlinks in the path. My example above > > was only considering what comes out of the `if ((pc_flags & ...) { ... } > > ' expression starting in line 3485 (assuming "b" is a native symlink). > > > > What I mean is this: Your patch disregards the entire string returned by > > GFPNBH, if the returned path is an UNC path, no matter what. > > > > But what if the incoming path already *was* an UNC path, and potentially > > contains native symlinks? In that case you have no reason to disregard > > the resulting path from GFPNBH. > > > > And if it was a drive letter path, wouldn't it be nicer to just convert > > the UNC path prefix back to the drive letter and keep the rest of the > > final path intact? > > > > However, both of these scenarios require extra code, which isn't that > > important for now, so, never mind. > ----- End forwarded message ----- > > What I meant is something like the below (entirely untested). Yeah, I'm > not sure myself, if it's worth the effort... > > diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc > index e254397257fd..06afd2d62996 100644 > --- a/winsup/cygwin/autoload.cc > +++ b/winsup/cygwin/autoload.cc > @@ -630,6 +630,7 @@ LoadDLLfunc (LdapMapErrorToWin32, 0, wldap32) > > LoadDLLfunc (WNetCloseEnum, 4, mpr) > LoadDLLfunc (WNetEnumResourceW, 16, mpr) > +LoadDLLfunc (WNetGetConnectionW, 12, mpr) > LoadDLLfunc (WNetGetProviderNameW, 12, mpr) > LoadDLLfunc (WNetGetResourceInformationW, 16, mpr) > LoadDLLfunc (WNetOpenEnumW, 20, mpr) > diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc > index baf04ce89a08..c7b29acf29b3 100644 > --- a/winsup/cygwin/path.cc > +++ b/winsup/cygwin/path.cc > @@ -3492,10 +3492,41 @@ 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)) > + { > + /* ...extract the drive letter, get the remote path, > + replace remote path with drive letter, check again. */ > + WCHAR drive[3] = { upath.Buffer[4], L':', L'\0' }; > + WCHAR remote[MAX_PATH]; > + > + if (WNetGetConnectionW (drive, remote, MAX_PATH) > + == NO_ERROR) > + { > + /* Hackfest */ > + fpath.Buffer[4] = drive[0]; > + fpath.Buffer[5] = L':'; > + WCHAR to = fpath.Buffer + 6; > + WCHAR from = to + wcslen (remote); > + 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. */ I confirmed that your patch works nicely. ...except when the drive is created by subst using UNC path, e.g. subst w: \\server\share. In this case, WNetGetConnectionW() fails with ERROR_NO_NET_OR_BAD_PATH. So, I modified your patch a bit. What about attached patch? -- Takashi Yano --Multipart=_Wed__8_Dec_2021_17_20_08_+0900_13n0sbfkwfBxj2Wa Content-Type: application/octet-stream; name="0001-Cygwin-path-Convert-UNC-path-prefix-back-to-drive-le.patch" Content-Disposition: attachment; filename="0001-Cygwin-path-Convert-UNC-path-prefix-back-to-drive-le.patch" Content-Transfer-Encoding: base64 RnJvbSBkYzIyMmVjNzNmNTM3ZTllNDc1NThiYmYxNTZkZDE3MzViOTA5NWU1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBUYWthc2hpIFlhbm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5q cD4KRGF0ZTogV2VkLCA4IERlYyAyMDIxIDE3OjA5OjE0ICswOTAwClN1YmplY3Q6IFtQQVRDSF0g Q3lnd2luOiBwYXRoOiBDb252ZXJ0IFVOQyBwYXRoIHByZWZpeCBiYWNrIHRvIGRyaXZlIGxldHRl ci4KCi0gV2hlbiBzeW1saW5rX2luZm86OmNoZWNrKCkgaXMgY2FsbGVkIHdpdGggdGhlIHBhdGgg aGF2aW5nIGRyaXZlCiAgbGV0dGVyIGFuZCBVTkMgcGF0aCBpcyBtb3VudGVkIHRvIHRoZSBkcml2 ZSwgdGhlIHBhdGggaXMgcmVwbGFjZWQKICB3aXRoIFVOQyBwYXRoLiBXaXRoIHRoaXMgcGF0Y2gs IFVOQyBwYXRoIHByZWZpeCBpcyBjb252ZXJ0ZWQgYmFjawogIHRvIGRyaXZlIGxldHRlci4gIFRo aXMgZml4ZXMgdGhlIGlzc3VlOgogIGh0dHBzOi8vY3lnd2luLmNvbS9waXBlcm1haWwvY3lnd2lu LzIwMjEtTm92ZW1iZXIvMjUwMDg3Lmh0bWwKICBodHRwczovL2N5Z3dpbi5jb20vcGlwZXJtYWls L2N5Z3dpbi8yMDIxLURlY2VtYmVyLzI1MDEwMy5odG1sCi0tLQogd2luc3VwL2N5Z3dpbi9wYXRo LmNjIHwgMzcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQogMSBmaWxlIGNo YW5nZWQsIDM2IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKCmRpZmYgLS1naXQgYS93aW5z dXAvY3lnd2luL3BhdGguY2MgYi93aW5zdXAvY3lnd2luL3BhdGguY2MKaW5kZXggYmFmMDRjZTg5 Li5lYjEyNTU4NDkgMTAwNjQ0Ci0tLSBhL3dpbnN1cC9jeWd3aW4vcGF0aC5jYworKysgYi93aW5z dXAvY3lnd2luL3BhdGguY2MKQEAgLTM0OTIsMTAgKzM0OTIsNDUgQEAgcmVzdGFydDoKIAkgICAg ewogCSAgICAgIFVOSUNPREVfU1RSSU5HIGZwYXRoOwogCi0JICAgICAgUnRsSW5pdENvdW50ZWRV bmljb2RlU3RyaW5nICgmZnBhdGgsIGZwYnVmLCByZXQgKiBzaXplb2YgKFdDSEFSKSk7CisJICAg ICAgLyogSWYgaW5jb21pbmcgcGF0aCBoYXMgbm8gdHJhaWxpbmcgYmFja3NsYXNoLCBidXQgZmlu YWwgcGF0aAorCQkgaGFzIG9uZSwgZHJvcCB0cmFpbGluZyBiYWNrc2xhc2ggZnJvbSBmaW5hbCBw YXRoIHNvIHRoZQorCQkgYmVsb3cgc3RyaW5nIGNvbXBhcmlzb24gaGFzIGEgY2hhbmNlIHRvIHN1 Y2NlZWQuICovCisJICAgICAgaWYgKHVwYXRoLkJ1ZmZlclsodXBhdGguTGVuZ3RoIC0gMSkgLyBz aXplb2YgKFdDSEFSKV0gIT0gTCdcXCcKKyAgICAgICAgICAgICAgICAgICYmIGZwYnVmW3JldCAt IDFdID09IEwnXFwnKQorICAgICAgICAgICAgICAgIGZwYnVmWy0tcmV0XSA9IEwnXDAnOwogCSAg ICAgIGZwYnVmWzFdID0gTCc/JzsJLyogXFw/XCAtLT4gXD8/XCAqLworCSAgICAgIFJ0bEluaXRD b3VudGVkVW5pY29kZVN0cmluZyAoJmZwYXRoLCBmcGJ1ZiwgcmV0ICogc2l6ZW9mIChXQ0hBUikp OwogCSAgICAgIGlmICghUnRsRXF1YWxVbmljb2RlU3RyaW5nICgmdXBhdGgsICZmcGF0aCwgISFj aV9mbGFnKSkKIAkgICAgICAgIHsKKwkJICAvKiBDaGVjayBpZiB0aGUgZmluYWwgcGF0aCBpcyBh biBVTkMgcGF0aCBhbmQgdGhlIGluY29taW5nCisJCSAgICAgcGF0aCBpc24ndC4gIElmIHNvLi4u ICovCisJCSAgaWYgKFJ0bEVxdWFsVW5pY29kZVBhdGhQcmVmaXggKCZmcGF0aCwgJnJvX3VfdW5j cCwgVFJVRSkKKwkJICAgICAgJiYgIVJ0bEVxdWFsVW5pY29kZVBhdGhQcmVmaXggKCZ1cGF0aCwg JnJvX3VfdW5jcCwgVFJVRSkpCisJCSAgICB7CisJCSAgICAgIC8qIC4uLmdldCB0aGUgcmVtb3Rl IHBhdGggZnJvbSB0aGUgdm9sdW1lIHBhdGggbmFtZSwKKwkJCSByZXBsYWNlIHJlbW90ZSBwYXRo IHdpdGggZHJpdmUgbGV0dGVyLCBjaGVjayBhZ2Fpbi4gKi8KKwkJICAgICAgV0NIQVIgcmVtb3Rl W01BWF9QQVRIXTsKKworCQkgICAgICBmcGJ1ZlsxXSA9IEwnXFwnOworCQkgICAgICBCT09MIHIg PSBHZXRWb2x1bWVQYXRoTmFtZVcgKGZwYnVmLCByZW1vdGUsIE1BWF9QQVRIKTsKKwkJICAgICAg ZnBidWZbMV0gPSBMJz8nOworCQkgICAgICBpZiAocikKKwkJCXsKKwkJCSAgaW50IHJlbWxlbiA9 IHdjc2xlbiAocmVtb3RlKTsKKwkJCSAgaWYgKHJlbW90ZVtyZW1sZW4gLSAxXSA9PSBMJ1xcJykK KwkJCSAgICByZW1sZW4tLTsKKwkJCSAgLyogSGFja2Zlc3QgKi8KKwkJCSAgZnBhdGguQnVmZmVy WzRdID0gdXBhdGguQnVmZmVyWzRdOyAvKiBEcml2ZSBsZXR0ZXIgKi8KKwkJCSAgZnBhdGguQnVm ZmVyWzVdID0gTCc6JzsKKwkJCSAgV0NIQVIgKnRvID0gZnBhdGguQnVmZmVyICsgNjsKKwkJCSAg V0NIQVIgKmZyb20gPSB0byArIHJlbWxlbiAtIDY7CisJCQkgIG1lbW1vdmUgKHRvLCBmcm9tLAor CQkJCSAgICh3Y3NsZW4gKGZyb20pICsgMSkgKiBzaXplb2YgKFdDSEFSKSk7CisJCQkgIGZwYXRo Lkxlbmd0aCAtPSAoZnJvbSAtIHRvKSAqIHNpemVvZiAoV0NIQVIpOworCQkJICBpZiAoUnRsRXF1 YWxVbmljb2RlU3RyaW5nICgmdXBhdGgsICZmcGF0aCwgISFjaV9mbGFnKSkKKwkJCSAgICBnb3Rv IGZpbGVfbm90X3N5bWxpbms7CisJCQl9CisJCSAgICB9CiAJCSAgaXNzeW1saW5rID0gdHJ1ZTsK IAkJICAvKiB1cGF0aC5CdWZmZXIgaXMgYmlnIGVub3VnaCBhbmQgdW51c2VkIGZyb20gdGhpcyBw b2ludCBvbi4KIAkJICAgICBSZXVzZSBpdCBoZXJlLCBhdm9pZGluZyB5ZXQgYW5vdGhlciBidWZm ZXIgYWxsb2NhdGlvbi4gKi8KLS0gCjIuMzQuMQoK --Multipart=_Wed__8_Dec_2021_17_20_08_+0900_13n0sbfkwfBxj2Wa--