diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2009-08-31 22:06:41 +1000 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2009-08-31 22:06:41 +1000 |
commit | 7877713690c498bb74823542231a81362e8eedb3 (patch) | |
tree | f7c227dd0aa36bf058b130bc48a2fd9e2cf90d3e | |
parent | [BUILTIN] Avoid compiler warnings on isdigit (diff) | |
download | dash-7877713690c498bb74823542231a81362e8eedb3.tar.gz dash-7877713690c498bb74823542231a81362e8eedb3.zip |
[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@byu.net> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | src/cd.c | 21 |
2 files changed, 12 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog index cb08ae5..d9dcb0c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,7 @@ 2009-08-31 Herbert Xu <herbert@gondor.apana.org.au> * Fix NUL termination in readcmd. + * Lookup PWD after going through CDPATH. 2009-08-11 Herbert Xu <herbert@gondor.apana.org.au> 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: |