ash: parser: Fix alias expansion after heredoc or newlines
Upstream commit: Date: Wed, 29 Apr 2020 00:19:59 +1000 parser: Fix alias expansion after heredoc or newlines This script should print OK: alias a="case x in " b=x a b) echo BAD;; esac alias BEGIN={ END=} BEGIN cat <<- EOF > /dev/null $(:) EOF END : <<- EOF && $(:) EOF BEGIN echo OK END However, because the value of checkkwd is either zeroed when it shouldn't, or isn't zeroed when it should, dash currently gets it wrong in every case. This patch fixes it by saving checkkwd and zeroing it where needed. function old new delta readtoken 157 176 +19 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
c540256127
commit
8c68ae8416
@ -13265,10 +13265,14 @@ readtoken(void)
|
|||||||
if (kwd & CHKNL) {
|
if (kwd & CHKNL) {
|
||||||
while (t == TNL) {
|
while (t == TNL) {
|
||||||
parseheredoc();
|
parseheredoc();
|
||||||
|
checkkwd = 0;
|
||||||
t = xxreadtoken();
|
t = xxreadtoken();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kwd |= checkkwd;
|
||||||
|
checkkwd = 0;
|
||||||
|
|
||||||
if (t != TWORD || quoteflag) {
|
if (t != TWORD || quoteflag) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -13287,7 +13291,7 @@ readtoken(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checkkwd & CHKALIAS) {
|
if (kwd & CHKALIAS) {
|
||||||
#if ENABLE_ASH_ALIAS
|
#if ENABLE_ASH_ALIAS
|
||||||
struct alias *ap;
|
struct alias *ap;
|
||||||
ap = lookupalias(wordtext, 1);
|
ap = lookupalias(wordtext, 1);
|
||||||
@ -13300,7 +13304,6 @@ readtoken(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
checkkwd = 0;
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
if (!alreadyseen)
|
if (!alreadyseen)
|
||||||
TRACE(("token '%s' %s\n", tokname_array[t], t == TWORD ? wordtext : ""));
|
TRACE(("token '%s' %s\n", tokname_array[t], t == TWORD ? wordtext : ""));
|
||||||
|
1
shell/ash_test/ash-alias/alias_brace.right
Normal file
1
shell/ash_test/ash-alias/alias_brace.right
Normal file
@ -0,0 +1 @@
|
|||||||
|
Ok
|
16
shell/ash_test/ash-alias/alias_brace.tests
Executable file
16
shell/ash_test/ash-alias/alias_brace.tests
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
# Note: bash would need:
|
||||||
|
#shopt -s expand_aliases
|
||||||
|
# to enable aliases in non-interactive mode
|
||||||
|
alias BEGIN={ END=}
|
||||||
|
BEGIN
|
||||||
|
cat <<- EOF > /dev/null
|
||||||
|
$(:)
|
||||||
|
EOF
|
||||||
|
END
|
||||||
|
|
||||||
|
: <<- EOF &&
|
||||||
|
$(:)
|
||||||
|
EOF
|
||||||
|
BEGIN
|
||||||
|
echo Ok
|
||||||
|
END
|
1
shell/ash_test/ash-alias/alias_case.right
Normal file
1
shell/ash_test/ash-alias/alias_case.right
Normal file
@ -0,0 +1 @@
|
|||||||
|
Ok
|
8
shell/ash_test/ash-alias/alias_case.tests
Executable file
8
shell/ash_test/ash-alias/alias_case.tests
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
# Note: bash would need:
|
||||||
|
#shopt -s expand_aliases
|
||||||
|
# to enable aliases in non-interactive mode
|
||||||
|
alias a="case x in " b=x
|
||||||
|
a
|
||||||
|
b) echo BAD;;
|
||||||
|
*) echo Ok;;
|
||||||
|
esac
|
Loading…
Reference in New Issue
Block a user