delorie.com/archives/browse.cgi   search  
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 -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019