From b4961ddeb9d0ce73911f95884a3791beac78edf7 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Mon, 23 Jun 2025 19:09:04 +0200 Subject: [PATCH] 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 --- ...0041-symlink_native-allow-linking-to.patch | 62 +++++++++++++++++++ msys2-runtime/PKGBUILD | 13 ++-- msys2-runtime/msys2-runtime.commit | 2 +- 3 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 msys2-runtime/0041-symlink_native-allow-linking-to.patch diff --git a/msys2-runtime/0041-symlink_native-allow-linking-to.patch b/msys2-runtime/0041-symlink_native-allow-linking-to.patch new file mode 100644 index 00000000..4af97c16 --- /dev/null +++ b/msys2-runtime/0041-symlink_native-allow-linking-to.patch @@ -0,0 +1,62 @@ +From bc3e285ac0a2c91080ac68279f0c9fd697a2d9b6 Mon Sep 17 00:00:00 2001 +From: Johannes Schindelin +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 +--- + 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); + } + } diff --git a/msys2-runtime/PKGBUILD b/msys2-runtime/PKGBUILD index 2e47fe7c..601044be 100644 --- a/msys2-runtime/PKGBUILD +++ b/msys2-runtime/PKGBUILD @@ -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() { diff --git a/msys2-runtime/msys2-runtime.commit b/msys2-runtime/msys2-runtime.commit index 7a8b0df6..eeccbeae 100644 --- a/msys2-runtime/msys2-runtime.commit +++ b/msys2-runtime/msys2-runtime.commit @@ -1 +1 @@ -1f8def9f776a7dd0d0381f4bf25e84f805393cc1 +bc3e285ac0a2c91080ac68279f0c9fd697a2d9b6