This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] Cygwin: fix utils path handling in case cygdrive path is just '/'


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=26bcedda20c88c7bfbcef106dbb240b8b591cf59

commit 26bcedda20c88c7bfbcef106dbb240b8b591cf59
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Fri Feb 16 17:21:48 2018 +0100

    Cygwin: fix utils path handling in case cygdrive path is just '/'
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/release/2.10.1 |  2 ++
 winsup/utils/path.cc         | 32 ++++++++++++++++++++------------
 2 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/winsup/cygwin/release/2.10.1 b/winsup/cygwin/release/2.10.1
index f8fd4cb..c08d102 100644
--- a/winsup/cygwin/release/2.10.1
+++ b/winsup/cygwin/release/2.10.1
@@ -11,3 +11,5 @@ What changed:
 Bug Fixes
 ---------
 
+- Fix utils path handling in case cygdrive path is just '/'.
+  Addresses: https://cygwin.com/ml/cygwin/2018-02/msg00174.html
diff --git a/winsup/utils/path.cc b/winsup/utils/path.cc
index a76cf76..fcc5c07 100644
--- a/winsup/utils/path.cc
+++ b/winsup/utils/path.cc
@@ -672,7 +672,7 @@ read_mounts ()
 */
 
 static int
-path_prefix_p (const char *path1, const char *path2, int len1)
+path_prefix_p (const char *path1, const char *path2, size_t len1)
 {
   /* Handle case where PATH1 has trailing '/' and when it doesn't.  */
   if (len1 > 0 && isslash (path1[len1 - 1]))
@@ -778,7 +778,7 @@ rel_vconcat (const char *cwd, const char *s, va_list v)
       cwd = pathbuf;
     }
 
-  int max_len = -1;
+  int max_len = 0;
   mnt_t *m, *match = NULL;
 
   for (m = mount_table; m->posix; m++)
@@ -786,7 +786,7 @@ rel_vconcat (const char *cwd, const char *s, va_list v)
       if (m->flags & MOUNT_CYGDRIVE)
 	continue;
 
-      int n = strlen (m->native);
+      size_t n = strlen (m->native);
       if (n < max_len || !path_prefix_p (m->native, cwd, n))
 	continue;
       max_len = n;
@@ -821,7 +821,7 @@ rel_vconcat (const char *cwd, const char *s, va_list v)
 static char *
 vcygpath (const char *cwd, const char *s, va_list v)
 {
-  int max_len = -1;
+  size_t max_len = 0;
   mnt_t *m, *match = NULL;
 
   if (!max_mount_entry)
@@ -843,15 +843,23 @@ vcygpath (const char *cwd, const char *s, va_list v)
 
   for (m = mount_table; m->posix; m++)
     {
-      int n = strlen (m->posix);
+      size_t n = strlen (m->posix);
       if (n < max_len || !path_prefix_p (m->posix, path, n))
 	continue;
-      if ((m->flags & MOUNT_CYGDRIVE)
-	  && ((int) strlen (path) < n + 2
-	      || path[n] != '/'
-	      || !isalpha (path[n + 1])
-	      || path[n + 2] != '/'))
-	continue;
+      if (m->flags & MOUNT_CYGDRIVE)
+	{
+	  if (strlen (path) < n + 2)
+	    continue;
+	  /* If cygdrive path is just '/', fix n for followup evaluation. */
+	  if (n == 1)
+	    n = 0;
+	  if (path[n] != '/')
+	    continue;
+	  if (!isalpha (path[n + 1]))
+	    continue;
+	  if (path[n + 2] != '/')
+	    continue;
+	}
       max_len = n;
       match = m;
     }
@@ -859,7 +867,7 @@ vcygpath (const char *cwd, const char *s, va_list v)
   char *native;
   if (match == NULL)
     native = strdup (path);
-  else if (max_len == (int) strlen (path))
+  else if (max_len == strlen (path))
     native = strdup (match->native);
   else if (match->flags & MOUNT_CYGDRIVE)
     {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]