[git commit] ash: parser: Save and restore heredoclist in expandstr

Denys Vlasenko vda.linux at googlemail.com
Tue Sep 7 22:56:53 UTC 2021


commit: https://git.busybox.net/busybox/commit/?id=1c06ddd8bbbd6906e5bf00ec93e04d5090718be9
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Upstream commit:

    Date: Sun, 17 May 2020 23:36:25 +1000
    parser: Save and restore heredoclist in expandstr

    On Sun, May 17, 2020 at 01:19:28PM +0100, Harald van Dijk wrote:
    > This still does not restore the state completely. It does not clean up any
    > pending heredocs. I see:
    >
    >   $ PS1='$(<<EOF "'
    >   src/dash: 1: Syntax error: Unterminated quoted string
    >   $(<<EOF ":
    >   >
    >
    > That is, after entering the ':' command, the shell is still trying to read
    > the heredoc from the prompt.

    This patch saves and restores the heredoclist in expandstr.

    It also removes a bunch of unnecessary volatiles as those variables
    are only referenced in case of a longjmp other than one started by
    a signal like SIGINT.

function                                             old     new   delta
expandstr                                            268     255     -13

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/shell/ash.c b/shell/ash.c
index 5a18ff1a1..cf62fdf75 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -13359,23 +13359,26 @@ parseheredoc(void)
 static const char *
 expandstr(const char *ps, int syntax_type)
 {
-	union node n;
+	struct parsefile *file_stop;
+	struct jmploc *volatile savehandler;
+	struct heredoc *saveheredoclist;
+	const char *result;
 	int saveprompt;
-	struct parsefile *file_stop = g_parsefile;
-	volatile int saveint;
-	struct jmploc *volatile savehandler = exception_handler;
 	struct jmploc jmploc;
-	const char *volatile result;
+	union node n;
 	int err;
 
+	file_stop = g_parsefile;
+
 	/* XXX Fix (char *) cast. */
 	setinputstring((char *)ps);
 
+	saveheredoclist = heredoclist;
+	heredoclist = NULL;
 	saveprompt = doprompt;
 	doprompt = 0;
 	result = ps;
-
-	SAVE_INT(saveint);
+	savehandler = exception_handler;
 	err = setjmp(jmploc.loc);
 	if (err)
 		goto out;
@@ -13402,11 +13405,11 @@ out:
 	exception_handler = savehandler;
 	if (err && exception_type != EXERROR)
 		longjmp(exception_handler->loc, 1);
-	RESTORE_INT(saveint);
 
 	doprompt = saveprompt;
 	/* Try: PS1='`xxx(`' */
 	unwindfiles(file_stop);
+	heredoclist = saveheredoclist;
 
 	return result;
 }


More information about the busybox-cvs mailing list