From a2e32b324eb7440f0cd4992f54f7a5822c145e91 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 12 Oct 2017 19:20:13 +0200 Subject: [PATCH] ash: survive failures in $PS1 expansion. Closes 10371 function old new delta expandstr 120 209 +89 Signed-off-by: Denys Vlasenko --- shell/ash.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/shell/ash.c b/shell/ash.c index 39705a350..ef81ea70f 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -12656,7 +12656,24 @@ expandstr(const char *ps, int syntax_type) saveprompt = doprompt; doprompt = 0; - readtoken1(pgetc(), syntax_type, FAKEEOFMARK, 0); + + /* readtoken1() might die horribly. + * Try a prompt with syntacticallyt wrong command: + * PS1='$(date "+%H:%M:%S) > ' + */ + { + volatile int saveint; + struct jmploc *volatile savehandler = exception_handler; + struct jmploc jmploc; + SAVE_INT(saveint); + if (setjmp(jmploc.loc) == 0) { + exception_handler = &jmploc; + readtoken1(pgetc(), syntax_type, FAKEEOFMARK, 0); + } + exception_handler = savehandler; + RESTORE_INT(saveint); + } + doprompt = saveprompt; popfile();