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:
parent
41b6a83547
commit
a2ae3a60f9
@ -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);
|
||||
|
@ -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
|
||||
|
26
bin/sh/tests/expansion/redir1.0
Normal file
26
bin/sh/tests/expansion/redir1.0
Normal 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))
|
Loading…
Reference in New Issue
Block a user