]> sourceware.org Git - newlib-cygwin.git/commitdiff
Cygwin: symlinks: fix WSL symlink creation if cygdrive prefix is /
authorCorinna Vinschen <corinna@vinschen.de>
Tue, 21 Apr 2020 08:31:53 +0000 (10:31 +0200)
committerCorinna Vinschen <corinna@vinschen.de>
Tue, 21 Apr 2020 08:39:36 +0000 (10:39 +0200)
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>
winsup/cygwin/path.cc

index f2b5cdbf1c2713c70ed681ad64ae5f1c682d4b46..36aa8278fd8495bdfe5ec82b8c36d7d3d7881ebb 100644 (file)
@@ -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);
This page took 0.0340549999999999 seconds and 5 git commands to generate.