ash: catch error in arithmetic expansion in PS1

Setting PS1 to:

   PS1='$((123+))'

causes the shell to enter an infinite error loop:

   sh: arithmetic syntax error

Catch any exception raised by expandarg() in expandstr() and allow
processing to continue.

function                                             old     new   delta
expandstr                                            262     344     +82
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 82/0)               Total: 82 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston 2019-04-18 09:49:13 +01:00 committed by Denys Vlasenko
parent 48645b8350
commit d1a2fa2a4e

View File

@ -13043,6 +13043,9 @@ expandstr(const char *ps, int syntax_type)
union node n; union node n;
int saveprompt; int saveprompt;
struct parsefile *file_stop = g_parsefile; struct parsefile *file_stop = g_parsefile;
volatile int saveint;
struct jmploc *volatile savehandler = exception_handler;
struct jmploc jmploc;
/* XXX Fix (char *) cast. */ /* XXX Fix (char *) cast. */
setinputstring((char *)ps); setinputstring((char *)ps);
@ -13054,18 +13057,13 @@ expandstr(const char *ps, int syntax_type)
* Try a prompt with syntactically wrong command: * Try a prompt with syntactically wrong command:
* PS1='$(date "+%H:%M:%S) > ' * PS1='$(date "+%H:%M:%S) > '
*/ */
{ SAVE_INT(saveint);
volatile int saveint; if (setjmp(jmploc.loc) == 0) {
struct jmploc *volatile savehandler = exception_handler; exception_handler = &jmploc;
struct jmploc jmploc; readtoken1(pgetc(), syntax_type, FAKEEOFMARK, 0);
SAVE_INT(saveint);
if (setjmp(jmploc.loc) == 0) {
exception_handler = &jmploc;
readtoken1(pgetc(), syntax_type, FAKEEOFMARK, 0);
}
exception_handler = savehandler;
RESTORE_INT(saveint);
} }
exception_handler = savehandler;
RESTORE_INT(saveint);
doprompt = saveprompt; doprompt = saveprompt;
@ -13077,7 +13075,17 @@ expandstr(const char *ps, int syntax_type)
n.narg.text = wordtext; n.narg.text = wordtext;
n.narg.backquote = backquotelist; n.narg.backquote = backquotelist;
expandarg(&n, NULL, EXP_QUOTED); /* expandarg() might fail too:
* PS1='$((123+))'
*/
SAVE_INT(saveint);
if (setjmp(jmploc.loc) == 0) {
exception_handler = &jmploc;
expandarg(&n, NULL, EXP_QUOTED);
}
exception_handler = savehandler;
RESTORE_INT(saveint);
return stackblock(); return stackblock();
} }