aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2018-11-19 18:43:58 +0800
committerBen Hutchings <ben@decadent.org.uk>2020-03-28 21:42:55 +0000
commite94b6379eb4db14efb17de19c411ea53d778fca3 (patch)
tree16ae6ab25445e2c1fa0d557fa711157066a06006
parent16419c03328ad90171240ed5f6ec0127117d43cd (diff)
downloadklibc-e94b6379eb4db14efb17de19c411ea53d778fca3.tar.gz
[klibc] dash: parser: Do not push token back before parseheredoc
[ dash commit 2c3ba509eb8117894d515e8fffc94aa099f38f8a ] When we read the first token in list() we use peektoken instead of readtoken as the following code needs to use the same token again. However, this is wrong when we're in a here-document as it will clobber the saved token without resetting the tokpushback flag. This patch fixes it by doing the tokpushback after parseheredoc and setting lasttoken again if parseheredoc was called. Reported-by: Ron Yorston <rmy@frippery.org> Fixes: 7c245aa8ed33 ("[PARSER] Simplify EOF/newline handling in...") Fixes: ee5cbe9fd6bc ("[SHELL] Optimize dash -c "command" to avoid a fork") Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Tested-by: Simon Ser <contact@emersion.fr> Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--usr/dash/parser.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/usr/dash/parser.c b/usr/dash/parser.c
index c4e63781e5e39..1f9e8ec05eff3 100644
--- a/usr/dash/parser.c
+++ b/usr/dash/parser.c
@@ -166,7 +166,7 @@ list(int nlflag)
n1 = NULL;
for (;;) {
- switch (peektoken()) {
+ switch (readtoken()) {
case TNL:
if (!(nlflag & 1))
break;
@@ -177,9 +177,12 @@ list(int nlflag)
if (!n1 && (nlflag & 1))
n1 = NEOF;
parseheredoc();
+ tokpushback++;
+ lasttoken = TEOF;
return n1;
}
+ tokpushback++;
checkkwd = CHKNL | CHKKWD | CHKALIAS;
if (nlflag == 2 && tokendlist[peektoken()])
return n1;