diff options
Diffstat (limited to 'Src/builtin.c')
-rw-r--r-- | Src/builtin.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/Src/builtin.c b/Src/builtin.c index 62c6e3c7d..162e7c254 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -1029,17 +1029,19 @@ cd_try_chdir(char *pfix, char *dest, int hard) /* handle directory prefix */ if (pfix && *pfix) { - if (*pfix == '/') + if (*pfix == '/') { #ifdef __CYGWIN__ /* NB: Don't turn "/"+"bin" into "//"+"bin" by mistake! "//bin" may * * not be what user really wants (probably wants "/bin"), but * * "//bin" could be valid too (see fixdir())! This is primarily for * - * handling CDPATH correctly. */ - buf = tricat(pfix, ( pfix[1] == '\0' ? "" : "/" ), dest); + * handling CDPATH correctly. Likewise for "//"+"bin" not becoming * + * "///bin" (aka "/bin"). */ + int root = pfix[1] == '\0' || (pfix[1] == '/' && pfix[2] == '\0'); + buf = tricat(pfix, ( root ? "" : "/" ), dest); #else buf = tricat(pfix, "/", dest); #endif - else { + } else { int pfl = strlen(pfix); dlen = strlen(pwd); @@ -1200,8 +1202,8 @@ fixdir(char *src) /* compress multiple /es into single */ if (*src == '/') { #ifdef __CYGWIN__ - /* allow leading // under cygwin */ - if (src == s0 && src[1] == '/') + /* allow leading // under cygwin, but /// still becomes / */ + if (src == s0 && src[1] == '/' && src[2] != '/') *dest++ = *src++; #endif *dest++ = *src++; |