From: Denys Vlasenko Date: Thu, 12 Oct 2017 17:20:13 +0000 (+0200) Subject: ash: survive failures in $PS1 expansion. Closes 10371 X-Git-Tag: 1_28_0~38 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=a2e32b324eb7440f0cd4992f54f7a5822c145e91;p=oweals%2Fbusybox.git ash: survive failures in $PS1 expansion. Closes 10371 function old new delta expandstr 120 209 +89 Signed-off-by: Denys Vlasenko --- 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();