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:
parent
8f777478ff
commit
fa0951d63a
@ -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);
|
||||
}
|
||||
}
|
||||
|
20
tools/regression/bin/sh/expansion/cmdsubst3.0
Normal file
20
tools/regression/bin/sh/expansion/cmdsubst3.0
Normal 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
|
Loading…
Reference in New Issue
Block a user