From 1c06ddd8bbbd6906e5bf00ec93e04d5090718be9 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 8 Sep 2021 00:56:53 +0200 Subject: [PATCH] ash: parser: Save and restore heredoclist in expandstr 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='$(< src/dash: 1: Syntax error: Unterminated quoted string > $(< > > > 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 --- 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; }