diff options
-rw-r--r-- | bin/sh/expand.c | 24 | ||||
-rw-r--r-- | tools/regression/bin/sh/expansion/pathname2.0 | 31 |
2 files changed, 46 insertions, 9 deletions
diff --git a/bin/sh/expand.c b/bin/sh/expand.c index 7d98737..2b522ab 100644 --- a/bin/sh/expand.c +++ b/bin/sh/expand.c @@ -1,6 +1,8 @@ /*- * Copyright (c) 1991, 1993 * The Regents of the University of California. All rights reserved. + * Copyright (c) 1997-2005 + * Herbert Xu <herbert@gondor.apana.org.au>. All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. @@ -1150,10 +1152,11 @@ expmeta(char *enddir, char *name) struct dirent *dp; int atend; int matchdot; + int esc; metaflag = 0; start = name; - for (p = name ; ; p++) { + for (p = name; esc = 0, *p; p += esc + 1) { if (*p == '*' || *p == '?') metaflag = 1; else if (*p == '[') { @@ -1178,12 +1181,14 @@ expmeta(char *enddir, char *name) break; else if (*p == CTLQUOTEMARK) continue; - else if (*p == CTLESC) - p++; - if (*p == '/') { - if (metaflag) - break; - start = p + 1; + else { + if (*p == CTLESC) + esc++; + if (p[esc] == '/') { + if (metaflag) + break; + start = p + esc + 1; + } } } if (metaflag == 0) { /* we've reached the end of the file name */ @@ -1229,7 +1234,8 @@ expmeta(char *enddir, char *name) atend = 1; } else { atend = 0; - *endname++ = '\0'; + *endname = '\0'; + endname += esc + 1; } matchdot = 0; p = start; @@ -1257,7 +1263,7 @@ expmeta(char *enddir, char *name) } closedir(dirp); if (! atend) - endname[-1] = '/'; + endname[-esc - 1] = esc ? CTLESC : '/'; } diff --git a/tools/regression/bin/sh/expansion/pathname2.0 b/tools/regression/bin/sh/expansion/pathname2.0 new file mode 100644 index 0000000..8a884ff --- /dev/null +++ b/tools/regression/bin/sh/expansion/pathname2.0 @@ -0,0 +1,31 @@ +# $FreeBSD$ + +failures=0 + +check() { + testcase=$1 + expect=$2 + eval "set -- $testcase" + actual="$*" + if [ "$actual" != "$expect" ]; then + failures=$((failures+1)) + printf '%s\n' "For $testcase, expected $expect actual $actual" + fi +} + +set -e +T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX) +trap 'rm -rf $T' 0 +cd -P $T + +mkdir testdir testdir2 'testdir/*' 'testdir/?' testdir/a testdir/b testdir2/b +mkdir testdir2/.c +touch testf 'testdir/*/1' 'testdir/?/1' testdir/a/1 testdir/b/1 testdir2/b/.a + +check '*\/' 'testdir/ testdir2/' +check '"testdir/"*"/1"' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1' +check '"testdir/"*"/"*' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1' +check '"testdir/"*\/*' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1' +check '"testdir"*"/"*"/"*' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1' + +exit $((failures != 0)) |