summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/path.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r--winsup/cygwin/path.cc24
1 files changed, 21 insertions, 3 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index cb38a25f1..e4075410f 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -1351,17 +1351,35 @@ conv_path_list (const char *src, char *dst, size_t size, int to_posix)
bool saw_empty = false;
do
{
- char *s = strccpy (srcbuf, &src, src_delim);
- size_t len = s - srcbuf;
+ char *srcpath = srcbuf;
+ char *s = strccpy (srcpath, &src, src_delim);
+ size_t len = s - srcpath;
if (len >= NT_MAX_PATH)
{
err = ENAMETOOLONG;
break;
}
+ /* Paths in Win32 path lists in the environment (%Path%), are often
+ enclosed in quotes (usually paths with spaces). Trailing backslashes
+ are common, too. Remove them. */
+ if (to_posix == ENV_CVT && len)
+ {
+ if (*srcpath == '"')
+ {
+ ++srcpath;
+ *--s = '\0';
+ len -= 2;
+ }
+ while (len && s[-1] == '\\')
+ {
+ *--s = '\0';
+ --len;
+ }
+ }
if (len)
{
++d;
- err = cygwin_conv_path (conv_fn, srcbuf, d, size - (d - dst));
+ err = cygwin_conv_path (conv_fn, srcpath, d, size - (d - dst));
}
else if (!to_posix)
{