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 <herb...@gondor.apana.org.au>
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 <e...@byu.net>
    Signed-off-by: Herbert Xu <herb...@gondor.apana.org.au>

diff --git a/ChangeLog b/ChangeLog
index cb08ae5..d9dcb0c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,7 @@
 2009-08-31  Herbert Xu <herb...@gondor.apana.org.au>
 
        * Fix NUL termination in readcmd.
+       * Lookup PWD after going through CDPATH.
 
 2009-08-11  Herbert Xu <herb...@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:

Thanks,
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herb...@gondor.apana.org.au>
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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to