msys2-runtime: fix creating native symlinks pointing to ..

This commit corresponds to
https://github.com/msys2/msys2-runtime/pull/292.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
Johannes Schindelin 2025-06-23 19:09:04 +02:00 committed by Christoph Reiter
parent 416fd2a7a1
commit b4961ddeb9
3 changed files with 71 additions and 6 deletions

View File

@ -0,0 +1,62 @@
From bc3e285ac0a2c91080ac68279f0c9fd697a2d9b6 Mon Sep 17 00:00:00 2001
From: Johannes Schindelin <johannes.schindelin@gmx.de>
Date: Thu, 19 Jun 2025 20:46:03 +0200
Subject: [PATCH 41/N] symlink_native: allow linking to `..`
When running
CYGWIN=winsymlinks:nativestrict ln -s .. abc
the counter-intuitive result is _not_ a symbolic link to `..`, but
instead to `../../$(basename "$PWD")`.
The reason for this is that the search for the longest common prefix
assumes that the link target is not a strict prefix of the parent
directory of the link itself.
Let's fix that.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
winsup/cygwin/path.cc | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 6f04658..ead7d16 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -2030,9 +2030,18 @@ symlink_native (const char *oldpath, path_conv &win32_newpath)
while (towupper (*++c_old) == towupper (*++c_new))
;
/* The last component could share a common prefix, so make sure we end
- up on the first char after the last common backslash. */
- while (c_old[-1] != L'\\')
- --c_old, --c_new;
+ up on the first char after the last common backslash.
+
+ However, if c_old is a strict prefix of c_new (at a component
+ boundary), or vice versa, then do not try to find the last common
+ backslash. */
+ if ((!*c_old || *c_old == L'\\') && (!*c_new || *c_new == L'\\'))
+ c_old += !!*c_old, c_new += !!*c_new;
+ else
+ {
+ while (c_old[-1] != L'\\')
+ --c_old, --c_new;
+ }
/* 2. Check if prefix is long enough. The prefix must at least points to
a complete device: \\?\X:\ or \\?\UNC\server\share\ are the minimum
@@ -2057,8 +2066,10 @@ symlink_native (const char *oldpath, path_conv &win32_newpath)
final_oldpath = &final_oldpath_buf;
final_oldpath->Buffer = tp.w_get ();
PWCHAR e_old = final_oldpath->Buffer;
- while (num-- > 0)
- e_old = wcpcpy (e_old, L"..\\");
+ while (num > 1 || (num == 1 && *c_old))
+ e_old = wcpcpy (e_old, L"..\\"), num--;
+ if (num > 0)
+ e_old = wcpcpy (e_old, L"..");
wcpcpy (e_old, c_old);
}
}

View File

@ -4,7 +4,7 @@
pkgbase=msys2-runtime
pkgname=('msys2-runtime' 'msys2-runtime-devel')
pkgver=3.6.3
pkgrel=3
pkgrel=4
pkgdesc="Cygwin POSIX emulation engine"
arch=('x86_64')
url="https://www.cygwin.com/"
@ -69,9 +69,10 @@ source=('msys2-runtime'::git://sourceware.org/git/newlib-cygwin.git#tag=cygwin-$
0037-Avoid-sharing-cygheaps-across-Cygwin-versions.patch
0038-uname-report-msys2-runtime-commit-hash-too.patch
0039-Cygwin-Adjust-CWD-magic-to-accommodate-for-the-lates.patch
0040-Cygwin-Fix-compatibility-with-w32api-headers-v13.patch)
0040-Cygwin-Fix-compatibility-with-w32api-headers-v13.patch
0041-symlink_native-allow-linking-to.patch)
sha256sums=('dd3cb54af2f8828d6857a3a595b02b09b23209570e0cc44342f4c9826845fb63'
'ff4f032ec1fdee986071bc20bb1480189b7bb4efdd5693b327ca664ee0bef3a1'
'eea82d3aac8b57ab34acf1e7dbb6e916f1bdc5106199379517adf2cf5edfd2ab'
'5538db757661949423563bab5e4f383dfa4ef0cf3301cf43f23b482392554b3b'
'2fb9b2b297797d20cd901eaee2de735e8cdda1c1e5836e9ff77856c0d1216860'
'780977d71e35bbe4c0dcda5272895267d68d635f311e224f7981858f7192a85e'
@ -111,7 +112,8 @@ sha256sums=('dd3cb54af2f8828d6857a3a595b02b09b23209570e0cc44342f4c9826845fb63'
'e2f58cba187f16b21df69dc3b7372f41bf2edfc543d136c62f85c83e0f22f3ad'
'd8baf6e0e9c44a60d133f506fc91fa79043543266c6142918fad2c234cf4d0b5'
'c5a5dd5645ce86f83824a2fe50ab3cc9df1211d2983bc18bbd11c608249e31b1'
'519323947b0f80d9416fff31eb981ce2cd9c74a3b42c3cd2f74bca3c8a703aa5')
'519323947b0f80d9416fff31eb981ce2cd9c74a3b42c3cd2f74bca3c8a703aa5'
'2d477d5ebb89c5674686306454356a093765e69719102224c7ab59ac50a7a99e')
# Helper macros to help make tasks easier #
apply_patch_with_msg() {
@ -189,7 +191,8 @@ prepare() {
0037-Avoid-sharing-cygheaps-across-Cygwin-versions.patch \
0038-uname-report-msys2-runtime-commit-hash-too.patch \
0039-Cygwin-Adjust-CWD-magic-to-accommodate-for-the-lates.patch \
0040-Cygwin-Fix-compatibility-with-w32api-headers-v13.patch
0040-Cygwin-Fix-compatibility-with-w32api-headers-v13.patch \
0041-symlink_native-allow-linking-to.patch
}
build() {

View File

@ -1 +1 @@
1f8def9f776a7dd0d0381f4bf25e84f805393cc1
bc3e285ac0a2c91080ac68279f0c9fd697a2d9b6