From 351f6541e96e6eca2a55c4519ecc020be82e6ffa Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Wed, 15 Jul 2009 08:43:25 +0000 Subject: Eric Blake: 27151: cd handling with initial // for Cygwin --- Src/builtin.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'Src') 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++; -- cgit 1.4.1