[newlib-cygwin/cygwin-3_6-branch] Cygwin: symlink_native: allow linking to `.` again
Jon Turney
jturney@sourceware.org
Thu Oct 9 16:24:34 GMT 2025
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=2ae6825d022ac4450cef168ce066d68810b3a6e2
commit 2ae6825d022ac4450cef168ce066d68810b3a6e2
Author: Johannes Schindelin <johannes.schindelin@gmx.de>
Date: Mon Oct 6 16:08:17 2025 +0200
Cygwin: symlink_native: allow linking to `.` again
In 827743ab76 (Cygwin: symlink_native: allow linking to `..`,
2025-06-20), I fixed linking to `..` (which had inadvertently
targeted an incorrect location prior to that fix), but inadvertently
broke linking to `.` (which would now try to pass the empty string as
`lpTargetFileName` to `CreateSymbolicLinkW()`, failing with an
`ERROR_INVALID_REPARSE_DATA` which would be surfaced as "Permission
denied").
Let's fix this by special-casing an empty string as path as referring to
the current directory.
Note: It is unclear to me why the `winsymlinks:nativestrict` code path
even tries to simplify the symbolic link's target path (e.g. turn an
absolute path into a relative one). As long as it refers to a regular
Win32 file or directory, I would think that even something like
`././c` should have only the slashes converted, not the path
simplified (i.e. `.\.\c` instead of `c`). But that's a larger
discussion, and I would like to have the bug worked around swiftly.
Fixes: 827743ab76 (Cygwin: symlink_native: allow linking to `..`, 2025-06-20)
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
(cherry picked from commit 60c67169d69577179bfe7b7f9d8c40fdb0a9b5f7)
Diff:
---
winsup/cygwin/path.cc | 5 ++++-
winsup/cygwin/release/3.6.5 | 2 ++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index ed0839893..8aff97acb 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -1895,7 +1895,10 @@ symlink_native (const char *oldpath, path_conv &win32_newpath)
e_old = wcpcpy (e_old, L"..\\"), num--;
if (num > 0)
e_old = wcpcpy (e_old, L"..");
- wcpcpy (e_old, c_old);
+ if (e_old == final_oldpath->Buffer && c_old[0] == L'\0')
+ wcpcpy (e_old, L".");
+ else
+ wcpcpy (e_old, c_old);
}
}
/* If the symlink target doesn't exist, don't create native symlink.
diff --git a/winsup/cygwin/release/3.6.5 b/winsup/cygwin/release/3.6.5
index d7cf8381f..8a4eff051 100644
--- a/winsup/cygwin/release/3.6.5
+++ b/winsup/cygwin/release/3.6.5
@@ -29,3 +29,5 @@ Fixes:
- Fix multi-thread safety of fork()/exec() by adding the same locking as was
done for spawn.
Addresses: https://cygwin.com/pipermail/cygwin/2025-September/258801.html
+
+- Fix native symlink to '.' (a regresison in 3.6.4)
More information about the Cygwin-cvs
mailing list