From 48645b83502a5add5429b6cbb19cf3a083f1adf4 Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Thu, 18 Apr 2019 09:48:13 +0100 Subject: ash: prevent error in backquotes in PS1 from exiting shell Setting PS1 to: PS1='`xxx(`' causes the shell to terminate with the error: sh: syntax error: unexpected end of file (expecting ")") This happens because old-style backquotes require the input to be reread and thus call setinputstring() a second time. Prevent the problem by unwinding all recently opened files in expandstr(). function old new delta unwindfiles - 22 +22 expandstr 247 262 +15 forkchild 631 625 -6 evalcommand 1694 1685 -9 ash_main 1346 1336 -10 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 1/3 up/down: 37/-25) Total: 12 bytes Signed-off-by: Ron Yorston Signed-off-by: Denys Vlasenko --- shell/ash.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shell/ash.c b/shell/ash.c index b707d00..f3a2c69 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -13042,6 +13042,7 @@ expandstr(const char *ps, int syntax_type) { union node n; int saveprompt; + struct parsefile *file_stop = g_parsefile; /* XXX Fix (char *) cast. */ setinputstring((char *)ps); @@ -13068,7 +13069,8 @@ expandstr(const char *ps, int syntax_type) doprompt = saveprompt; - popfile(); + /* Try: PS1='`xxx(`' */ + unwindfiles(file_stop); n.narg.type = NARG; n.narg.next = NULL; -- cgit v1.1