[klibc] [klibc:update-dash] dash: parser: Save/restore here-documents in command substitution

klibc-bot for Herbert Xu herbert at gondor.apana.org.au
Sat Mar 28 14:49:18 PDT 2020


Commit-ID:  f7bb177a0dbd9750f78988a3636fa3c32418f6d7
Gitweb:     http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=f7bb177a0dbd9750f78988a3636fa3c32418f6d7
Author:     Herbert Xu <herbert at gondor.apana.org.au>
AuthorDate: Sat, 19 May 2018 02:39:42 +0800
Committer:  Ben Hutchings <ben at decadent.org.uk>
CommitDate: Sat, 28 Mar 2020 21:42:55 +0000

[klibc] dash: parser: Save/restore here-documents in command substitution

[ dash commit 51e2d88d6e513150a76c007111bbee21bb922c33 ]

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 at gondor.apana.org.au>
Signed-off-by: Ben Hutchings <ben at decadent.org.uk>

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

diff --git a/usr/dash/parser.c b/usr/dash/parser.c
index 8bd3db44..809c6a8a 100644
--- a/usr/dash/parser.c
+++ b/usr/dash/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);


More information about the klibc mailing list