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
This commit is contained in:
jilles 2014-10-31 22:28:10 +00:00
parent 41b6a83547
commit a2ae3a60f9
3 changed files with 28 additions and 1 deletions

View File

@ -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);

View File

@ -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

View File

@ -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))