diff options
author | jilles <jilles@FreeBSD.org> | 2014-12-29 15:11:07 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2014-12-29 15:11:07 +0000 |
commit | ca31dd6023ba06fea001d33fec8ad47e935df007 (patch) | |
tree | cb8d8fb328118ca35e53c98c91f9a691a751bd25 /bin | |
parent | 517ef2d35127d2138a5e90592861babfc9888aa5 (diff) | |
download | FreeBSD-src-ca31dd6023ba06fea001d33fec8ad47e935df007.zip FreeBSD-src-ca31dd6023ba06fea001d33fec8ad47e935df007.tar.gz |
MFC r273920: sh: Fix corruption of CTL* bytes in positional parameters in
redirection.
EXP_REDIR was not being checked for while expanding positional parameters in
redirection, so CTL* bytes were not being prefixed where they should be.
Diffstat (limited to 'bin')
-rw-r--r-- | bin/sh/expand.c | 2 | ||||
-rw-r--r-- | bin/sh/tests/expansion/Makefile | 1 | ||||
-rw-r--r-- | bin/sh/tests/expansion/redir1.0 | 26 |
3 files changed, 28 insertions, 1 deletions
diff --git a/bin/sh/expand.c b/bin/sh/expand.c index 67bae6e..60eaaf7 100644 --- a/bin/sh/expand.c +++ b/bin/sh/expand.c @@ -867,7 +867,7 @@ varisset(const char *name, int nulok) static void strtodest(const char *p, int flag, int subtype, int quoted) { - if (flag & (EXP_FULL | EXP_CASE) && subtype != VSLENGTH) + if (flag & (EXP_FULL | EXP_CASE | EXP_REDIR) && subtype != VSLENGTH) STPUTS_QUOTES(p, quoted ? DQSYNTAX : BASESYNTAX, expdest); else STPUTS(p, expdest); diff --git a/bin/sh/tests/expansion/Makefile b/bin/sh/tests/expansion/Makefile index bd24319..5b52efc 100644 --- a/bin/sh/tests/expansion/Makefile +++ b/bin/sh/tests/expansion/Makefile @@ -69,6 +69,7 @@ FILES+= plus-minus7.0 FILES+= plus-minus8.0 FILES+= question1.0 FILES+= readonly1.0 +FILES+= redir1.0 FILES+= set-u1.0 FILES+= set-u2.0 FILES+= set-u3.0 diff --git a/bin/sh/tests/expansion/redir1.0 b/bin/sh/tests/expansion/redir1.0 new file mode 100644 index 0000000..aa13e15 --- /dev/null +++ b/bin/sh/tests/expansion/redir1.0 @@ -0,0 +1,26 @@ +# $FreeBSD$ + +bad=0 +for i in 0 1 2 3; do + for j in 0 1 2 3 4 5 6 7; do + for k in 0 1 2 3 4 5 6 7; do + case $i$j$k in + 000) continue ;; + esac + set -- "$(printf \\$i$j$k@)" + set -- "${1%@}" + ff= + for f in /dev/null /dev/zero /; do + if [ -e "$f" ] && [ ! -e "$f$1" ]; then + ff=$f + fi + done + [ -n "$ff" ] || continue + if { true <$ff$1; } 2>/dev/null; then + echo "Bad: $i$j$k ($ff)" >&2 + : $((bad += 1)) + fi + done + done +done +exit $((bad ? 2 : 0)) |