summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/path.cc24
2 files changed, 26 insertions, 3 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 72ea9ad7b..376618d2f 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-02 Corinna Vinschen <corinna@vinschen.de>
+
+ * path.cc (conv_path_list): Remove enclosing quotes and trailing
+ backslashes from Win32 environment path lists.
+
2011-02-01 Christian Franke <franke@computer.org>
* fhandler.cc (fhandler_base::fsync): Ignore ERROR_INVALID_FUNCTION
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)
{