Mail Archives: cygwin/2021/12/08/03:21:08
X-Recipient: | archive-cygwin AT delorie DOT com
|
X-Original-To: | cygwin AT cygwin DOT com
|
Delivered-To: | cygwin AT cygwin DOT com
|
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
|
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 <takashi DOT yano AT nifty DOT ne DOT jp>
|
To: | cygwin AT cygwin DOT com
|
Subject: | Re: vboxsharedfs - Too many levels of symbolic links
|
Message-Id: | <20211208172008.01b11239c374604abf638a19@nifty.ne.jp>
|
In-Reply-To: | <Ya+WvmECA+zAbuV9@calimero.vinschen.de>
|
References: | <Ya+WvmECA+zAbuV9 AT calimero DOT vinschen DOT de>
|
X-Mailer: | Sylpheed 3.7.0 (GTK+ 2.24.30; i686-pc-mingw32)
|
Mime-Version: | 1.0
|
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 AT cygwin DOT com
|
X-Mailman-Version: | 2.1.29
|
List-Id: | General Cygwin discussions and problem reports <cygwin.cygwin.com>
|
List-Unsubscribe: | <https://cygwin.com/mailman/options/cygwin>,
|
| <mailto:cygwin-request AT cygwin DOT com?subject=unsubscribe>
|
List-Archive: | <https://cygwin.com/pipermail/cygwin/>
|
List-Post: | <mailto:cygwin AT cygwin DOT com>
|
List-Help: | <mailto:cygwin-request AT cygwin DOT com?subject=help>
|
List-Subscribe: | <https://cygwin.com/mailman/listinfo/cygwin>,
|
| <mailto:cygwin-request AT cygwin DOT com?subject=subscribe>
|
Errors-To: | cygwin-bounces+archive-cygwin=delorie DOT com AT cygwin DOT com
|
Sender: | "Cygwin" <cygwin-bounces+archive-cygwin=delorie DOT com AT cygwin DOT com>
|
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 <corinna-cygwin AT cygwin DOT com> -----
> > 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 <takashi DOT yano AT nifty DOT ne DOT jp>
--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
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
--
Problem reports: https://cygwin.com/problems.html
FAQ: https://cygwin.com/faq/
Documentation: https://cygwin.com/docs.html
Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple
--Multipart=_Wed__8_Dec_2021_17_20_08_+0900_13n0sbfkwfBxj2Wa--
- Raw text -