diff mbox series

parser: Do not push token back before parseheredoc

Message ID 20181119104357.hll2lcq4bfaqabpo@gondor.apana.org.au (mailing list archive)
State Accepted
Delegated to: Herbert Xu
Headers show
Series parser: Do not push token back before parseheredoc | expand

Commit Message

Herbert Xu Nov. 19, 2018, 10:43 a.m. UTC
Sorry for the repost, I'm trying to get this into patchwork.

---8<---
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>

Comments

Simon Ser Nov. 20, 2018, 9:51 p.m. UTC | #1
On Monday, November 19, 2018 11:43 AM, Herbert Xu <herbert@gondor.apana.org.au> wrote:
> Sorry for the repost, I'm trying to get this into patchwork.
>
> ---8<---
> 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>

This works for me.

Tested-by: Simon Ser <contact@emersion.fr>

Thanks!
diff mbox series

Patch

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;