diff mbox

[v3,5/17] parser: Save/restore here-documents in command substitution

Message ID E1fJkI2-0005oL-Az@gondobar (mailing list archive)
State Accepted
Delegated to: Herbert Xu
Headers show

Commit Message

Herbert Xu May 18, 2018, 6:39 p.m. UTC
This patch changes the parsing of here-documents within command
substitution, both old style and new style.  In particular, the
original here-document list is saved upon the beginning of parsing
command substitution and restored when exiting.

This means that here-documents outside of command substitution
can no longer be filled by text within it and vice-versa.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
---

 src/parser.c |   19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/src/parser.c b/src/parser.c
index 8bd3db4..809c6a8 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1368,6 +1368,7 @@  parsebackq: {
 	union node *n;
 	char *str;
 	size_t savelen;
+	struct heredoc *saveheredoclist;
 	int uninitialized_var(saveprompt);
 
 	str = NULL;
@@ -1432,6 +1433,9 @@  done:
 	*nlpp = (struct nodelist *)stalloc(sizeof (struct nodelist));
 	(*nlpp)->next = NULL;
 
+	saveheredoclist = heredoclist;
+	heredoclist = NULL;
+
 	if (oldstyle) {
 		saveprompt = doprompt;
 		doprompt = 0;
@@ -1444,17 +1448,18 @@  done:
 	else {
 		if (readtoken() != TRP)
 			synexpect(TRP);
+		setinputstring(nullstr);
+		parseheredoc();
 	}
 
+	heredoclist = saveheredoclist;
+
 	(*nlpp)->n = n;
-        if (oldstyle) {
-		/*
-		 * Start reading from old file again, ignoring any pushed back
-		 * tokens left from the backquote parsing
-		 */
-                popfile();
+	/* Start reading from old file again. */
+	popfile();
+	/* Ignore any pushed back tokens left from the backquote parsing. */
+	if (oldstyle)
 		tokpushback = 0;
-	}
 	while (stackblocksize() <= savelen)
 		growstackblock();
 	STARTSTACKSTR(out);