diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2020-04-21 10:31:53 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2020-04-21 10:39:36 +0200 |
commit | 6b97962073097adb7efe6ac04265df6a8596af21 (patch) | |
tree | a53e2b16087de2c802ac29ceabd2d58b2e2f17f0 | |
parent | 5951b3e600f32fd1d96b73f4ccf05d081a5d9428 (diff) | |
download | cygnal-6b97962073097adb7efe6ac04265df6a8596af21.tar.gz cygnal-6b97962073097adb7efe6ac04265df6a8596af21.tar.bz2 cygnal-6b97962073097adb7efe6ac04265df6a8596af21.zip |
Cygwin: symlinks: fix WSL symlink creation if cygdrive prefix is /
If the cygdrive prefix is /, then the following happens right now:
$ ln -s /tmp/foo .
$ ls -l foo
lrwxrwxrwx 1 user group 12 Apr 15 23:44 foo -> /mnt/tmp/foo
Fix this by skipping cygdrive prefix conversion to WSL drive
prefix "/mnt", if the cygdrive prefix is just "/". There's no
satisfying way to do the right thing all the time in this case
anyway. For a description and the alternatives, see
https://cygwin.com/pipermail/cygwin-developers/2020-April/011859.html
Also, fix a typo in a comment.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/path.cc | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index f2b5cdbf1..36aa8278f 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -1886,15 +1886,17 @@ symlink_wsl (const char *oldpath, path_conv &win32_newpath) rpl->ReparseTag = IO_REPARSE_TAG_LX_SYMLINK; rpl->Reserved = 0; rpl->LxSymlinkReparseBuffer.FileType = 2; - /* Convert cygdrive prefix to "/mnt" for WSL compatibility. */ - if (path_prefix_p (mount_table->cygdrive, oldpath, - mount_table->cygdrive_len, false)) + /* Convert cygdrive prefix to "/mnt" for WSL compatibility, but only if + cygdrive prefix is not "/", otherwise suffer random "/mnt" symlinks... */ + if (mount_table->cygdrive_len > 1 + && path_prefix_p (mount_table->cygdrive, oldpath, + mount_table->cygdrive_len, false)) stpcpy (stpcpy (path_buf, "/mnt"), oldpath + mount_table->cygdrive_len - 1); else *stpncpy (path_buf, oldpath, max_pathlen) = '\0'; /* Convert target path to UTF-16 and then back to UTF-8 to make sure the - WSL symlink is in UTF-8, independet of the current Cygwin codeset. */ + WSL symlink is in UTF-8, independent of the current Cygwin codeset. */ sys_mbstowcs (utf16, NT_MAX_PATH, path_buf); len = WideCharToMultiByte (CP_UTF8, 0, utf16, -1, path_buf, max_pathlen, NULL, NULL); |