From 2c3ba509eb8117894d515e8fffc94aa099f38f8a Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Mon, 19 Nov 2018 18:43:58 +0800 Subject: parser: Do not push token back before parseheredoc 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 Fixes: 7c245aa8ed33 ("[PARSER] Simplify EOF/newline handling in...") Fixes: ee5cbe9fd6bc ("[SHELL] Optimize dash -c "command" to avoid a fork") Signed-off-by: Herbert Xu Tested-by: Simon Ser --- src/parser.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/parser.c b/src/parser.c index c4e6378..1f9e8ec 100644 --- a/src/parser.c +++ b/src/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; -- cgit 1.4.1