On Tue, Jul 14, 2009 at 09:39:03PM +0000, Eric Blake wrote: > For the cd command, POSIX 2008 requires that after all pathnames in CDPATH have > been tested and failed in step 5, then step 6 interprets the directory argument > relative to PWD. In other words, this demonstrates a bug: > > $ dash -c 'cd /tmp; mkdir -p foo; CDPATH=oops; cd foo; echo $?; pwd' > cd: 1: can't cd to foo > 2 > /tmp > > while bash gets it correct: > > $ bash -c 'cd /tmp; mkdir -p foo; CDPATH=oops; cd foo; echo $?; pwd' > 0 > /tmp/foo This patch fixes the first part. commit 7877713690c498bb74823542231a81362e8eedb3 Author: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> Date: Mon Aug 31 22:06:41 2009 +1000 [CD] Lookup PWD after going through CDPATH On Tue, Jul 14, 2009 at 09:39:03PM +0000, Eric Blake wrote: > For the cd command, POSIX 2008 requires that after all pathnames in CDPATH > have been tested and failed in step 5, then step 6 interprets the directory > argument relative to PWD. In other words, this demonstrates a bug: > > $ dash -c 'cd /tmp; mkdir -p foo; CDPATH=oops; cd foo; echo $?; pwd' > cd: 1: can't cd to foo > 2 > /tmp > > while bash gets it correct: > > $ bash -c 'cd /tmp; mkdir -p foo; CDPATH=oops; cd foo; echo $?; pwd' > 0 > /tmp/foo This patch fixes the problem. Reported-by: Eric Blake <ebb9@xxxxxxx> Signed-off-by: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> diff --git a/ChangeLog b/ChangeLog index cb08ae5..d9dcb0c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,7 @@ 2009-08-31 Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> * Fix NUL termination in readcmd. + * Lookup PWD after going through CDPATH. 2009-08-11 Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> diff --git a/src/cd.c b/src/cd.c index 3770664..9a69b69 100644 --- a/src/cd.c +++ b/src/cd.c @@ -106,7 +106,7 @@ cdcmd(int argc, char **argv) if (!dest) dest = nullstr; if (*dest == '/') - goto step7; + goto step6; if (*dest == '.') { c = dest[1]; dotdot: @@ -122,13 +122,8 @@ dotdot: } if (!*dest) dest = "."; - if (!(path = bltinlookup("CDPATH"))) { -step6: -step7: - p = dest; - goto docd; - } - do { + path = bltinlookup("CDPATH"); + while (path) { c = *path; p = padvance(&path, dest); if (stat(p, &statb) >= 0 && S_ISDIR(statb.st_mode)) { @@ -137,9 +132,15 @@ step7: docd: if (!docd(p, flags)) goto out; - break; + goto err; } - } while (path); + } + +step6: + p = dest; + goto docd; + +err: sh_error("can't cd to %s", dest); /* NOTREACHED */ out: Thanks, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@xxxxxxxxxxxxxxxxxxx> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- To unsubscribe from this list: send the line "unsubscribe dash" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html