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.cc27
1 files changed, 19 insertions, 8 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 7f169fdf4..568072f4c 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -1089,18 +1089,29 @@ normalize_win32_path (const char *src, char *dst, char *&tail)
bool beg_src_slash = isdirsep (src[0]);
tail = dst;
- if (beg_src_slash && isdirsep (src[1]) && src[2])
+ if (beg_src_slash && isdirsep (src[1]))
{
- *tail++ = '\\';
- src++;
- if (src[1] == '.' && isdirsep (src[2]))
- {
- *tail++ = '\\';
- *tail++ = '.';
+ if (isdirsep (src[2]))
+ {
+ /* More than two slashes are just folded into one. */
src += 2;
+ while (isdirsep (src[1]))
+ ++src;
+ }
+ else
+ {
+ /* Two slashes start a network or device path. */
+ *tail++ = '\\';
+ src++;
+ if (src[1] == '.' && isdirsep (src[2]))
+ {
+ *tail++ = '\\';
+ *tail++ = '.';
+ src += 2;
+ }
}
}
- else if (!isdrive(src) && *src != '/')
+ if (tail == dst && !isdrive(src) && isdirsep (*src))
{
if (beg_src_slash)
tail += cygheap->cwd.get_drive (dst);