sh: Fix corruption of command substitutions with special chars after newline

The CTLESC byte to protect a special character was output before instead of
after a newline directly preceding the special character.

The special handling of newlines is because command substitutions discard
all trailing newlines.
This commit is contained in:
Jilles Tjoelker 2010-12-16 23:28:20 +00:00
parent 8f777478ff
commit fa0951d63a
2 changed files with 22 additions and 2 deletions

View File

@ -499,8 +499,6 @@ expbackq(union node *cmd, int quoted, int flag)
}
lastc = *p++;
if (lastc != '\0') {
if (quotes && syntax[(int)lastc] == CCTL)
STPUTC(CTLESC, dest);
if (lastc == '\n') {
nnl++;
} else {
@ -508,6 +506,8 @@ expbackq(union node *cmd, int quoted, int flag)
nnl--;
STPUTC('\n', dest);
}
if (quotes && syntax[(int)lastc] == CCTL)
STPUTC(CTLESC, dest);
STPUTC(lastc, dest);
}
}

View File

@ -0,0 +1,20 @@
# $FreeBSD$
e=
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
e="$e\n\\$i$j$k"
done
done
done
e1=$(printf "$e")
e2="$(printf "$e")"
[ "${#e1}" = 510 ] || echo length bad
[ "$e1" = "$e2" ] || echo e1 != e2
[ "$e1" = "$(printf "$e")" ] || echo quoted bad
IFS=
[ "$e1" = $(printf "$e") ] || echo unquoted bad