diff options
author | jilles <jilles@FreeBSD.org> | 2014-10-28 22:14:31 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2014-10-28 22:14:31 +0000 |
commit | 10a925c0a7cdeafe07ede1a1e848377970d03b2a (patch) | |
tree | bff51b62df045acab93fc518d065dddfe5e233c3 | |
parent | d47eb7d2d46dabce3135bac7e98b771b40aff97d (diff) | |
download | FreeBSD-src-10a925c0a7cdeafe07ede1a1e848377970d03b2a.zip FreeBSD-src-10a925c0a7cdeafe07ede1a1e848377970d03b2a.tar.gz |
Treat IFS separators in "$*" as quoted.
This makes a difference if IFS starts with *, ?, [ or a CTL* byte.
-rw-r--r-- | bin/sh/expand.c | 13 | ||||
-rw-r--r-- | bin/sh/tests/parameters/Makefile | 2 | ||||
-rw-r--r-- | bin/sh/tests/parameters/positional6.0 | 7 | ||||
-rw-r--r-- | bin/sh/tests/parameters/positional7.0 | 8 |
4 files changed, 25 insertions, 5 deletions
diff --git a/bin/sh/expand.c b/bin/sh/expand.c index e0be64a..0a9d329 100644 --- a/bin/sh/expand.c +++ b/bin/sh/expand.c @@ -878,7 +878,7 @@ varvalue(const char *name, int quoted, int subtype, int flag) int num; char *p; int i; - char sep; + char sep[2]; char **ap; switch (*name) { @@ -912,15 +912,18 @@ varvalue(const char *name, int quoted, int subtype, int flag) /* FALLTHROUGH */ case '*': if (ifsset()) - sep = ifsval()[0]; + sep[0] = ifsval()[0]; else - sep = ' '; + sep[0] = ' '; + sep[1] = '\0'; for (ap = shellparam.p ; (p = *ap++) != NULL ; ) { strtodest(p, flag, subtype, quoted); if (!*ap) break; - if (sep || (flag & EXP_FULL && !quoted && **ap != '\0')) - STPUTC(sep, expdest); + if (sep[0]) + strtodest(sep, flag, subtype, quoted); + else if (flag & EXP_FULL && !quoted && **ap != '\0') + STPUTC('\0', expdest); } return; default: diff --git a/bin/sh/tests/parameters/Makefile b/bin/sh/tests/parameters/Makefile index 4716529..231ed4d 100644 --- a/bin/sh/tests/parameters/Makefile +++ b/bin/sh/tests/parameters/Makefile @@ -18,6 +18,8 @@ FILES+= positional2.0 FILES+= positional3.0 FILES+= positional4.0 FILES+= positional5.0 +FILES+= positional6.0 +FILES+= positional7.0 FILES+= pwd1.0 FILES+= pwd2.0 diff --git a/bin/sh/tests/parameters/positional6.0 b/bin/sh/tests/parameters/positional6.0 new file mode 100644 index 0000000..1410668 --- /dev/null +++ b/bin/sh/tests/parameters/positional6.0 @@ -0,0 +1,7 @@ +# $FreeBSD$ + +IFS=? +set p r +v=pqrs +r=${v#"$*"} +[ "$r" = pqrs ] diff --git a/bin/sh/tests/parameters/positional7.0 b/bin/sh/tests/parameters/positional7.0 new file mode 100644 index 0000000..f170ad3 --- /dev/null +++ b/bin/sh/tests/parameters/positional7.0 @@ -0,0 +1,8 @@ +# $FreeBSD$ + +set -- / '' +IFS=* +set -- "$*" +IFS=: +args="$*" +[ "$#:$args" = "1:/*" ] |