From 7877713690c498bb74823542231a81362e8eedb3 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Mon, 31 Aug 2009 22:06:41 +1000 Subject: [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 Signed-off-by: Herbert Xu --- src/cd.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'src/cd.c') 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: -- cgit 1.4.1