summaryrefslogtreecommitdiffstats
path: root/bin/sh
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2014-12-29 15:11:07 +0000
committerjilles <jilles@FreeBSD.org>2014-12-29 15:11:07 +0000
commitca31dd6023ba06fea001d33fec8ad47e935df007 (patch)
treecb8d8fb328118ca35e53c98c91f9a691a751bd25 /bin/sh
parent517ef2d35127d2138a5e90592861babfc9888aa5 (diff)
downloadFreeBSD-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/sh')
-rw-r--r--bin/sh/expand.c2
-rw-r--r--bin/sh/tests/expansion/Makefile1
-rw-r--r--bin/sh/tests/expansion/redir1.026
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))
OpenPOWER on IntegriCloud