diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2020-04-29 00:19:59 +1000 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2020-05-15 16:24:38 +1000 |
commit | 07951cfffb218291e7574b874660eab652cb54f1 (patch) | |
tree | ba85a61937b42600400e9fb7a78e0181ce627fb9 /src | |
parent | parser: Catch errors in expandstr (diff) | |
download | dash-07951cfffb218291e7574b874660eab652cb54f1.tar.gz dash-07951cfffb218291e7574b874660eab652cb54f1.zip |
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. Suggested-by: Harald van Dijk <harald@gigawatt.nl> Reported-by: Harald van Dijk <harald@gigawatt.nl> Reported-by: Martijn Dekker <martijn@inlv.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'src')
-rw-r--r-- | src/parser.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/parser.c b/src/parser.c index 9c9a7dc..3131045 100644 --- a/src/parser.c +++ b/src/parser.c @@ -704,10 +704,14 @@ top: if (kwd & CHKNL) { while (t == TNL) { parseheredoc(); + checkkwd = 0; t = xxreadtoken(); } } + kwd |= checkkwd; + checkkwd = 0; + if (t != TWORD || quoteflag) { goto out; } @@ -725,7 +729,7 @@ top: } } - if (checkkwd & CHKALIAS) { + if (kwd & CHKALIAS) { struct alias *ap; if ((ap = lookupalias(wordtext, 1)) != NULL) { if (*ap->val) { @@ -735,7 +739,6 @@ top: } } out: - checkkwd = 0; #ifdef DEBUG if (!alreadyseen) TRACE(("token %s %s\n", tokname[t], t == TWORD ? wordtext : "")); |