svn commit: r273920 - in head/bin/sh: . tests/expansion
Jilles Tjoelker
jilles at FreeBSD.org
Fri Oct 31 22:28:12 UTC 2014
Author: jilles
Date: Fri Oct 31 22:28:10 2014
New Revision: 273920
URL: https://svnweb.freebsd.org/changeset/base/273920
Log:
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.
MFC after: 1 week
Added:
head/bin/sh/tests/expansion/redir1.0 (contents, props changed)
Modified:
head/bin/sh/expand.c
head/bin/sh/tests/expansion/Makefile
Modified: head/bin/sh/expand.c
==============================================================================
--- head/bin/sh/expand.c Fri Oct 31 22:20:27 2014 (r273919)
+++ head/bin/sh/expand.c Fri Oct 31 22:28:10 2014 (r273920)
@@ -862,7 +862,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);
Modified: head/bin/sh/tests/expansion/Makefile
==============================================================================
--- head/bin/sh/tests/expansion/Makefile Fri Oct 31 22:20:27 2014 (r273919)
+++ head/bin/sh/tests/expansion/Makefile Fri Oct 31 22:28:10 2014 (r273920)
@@ -72,6 +72,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
Added: head/bin/sh/tests/expansion/redir1.0
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/bin/sh/tests/expansion/redir1.0 Fri Oct 31 22:28:10 2014 (r273920)
@@ -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))
More information about the svn-src-head
mailing list