The dash maintainer recently posted a fix for issues with expanding PS1. These had already been fixed differently in BusyBox ash. Borrow a couple of improvements:
- Use a single call to setjmp() to trap errors in both readtoken1() and expandarg(). - In case of error set the prompt to the literal value of PS1 rather than the half-digested nonsense in stackblock() which might include ugly control characters. function old new delta expandstr 353 300 -53 Signed-off-by: Ron Yorston <[email protected]> --- shell/ash.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/shell/ash.c b/shell/ash.c index 4b5eafa7c..e87c91ece 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -13098,29 +13098,26 @@ expandstr(const char *ps, int syntax_type) volatile int saveint; struct jmploc *volatile savehandler = exception_handler; struct jmploc jmploc; + const char *volatile result; + int err; /* XXX Fix (char *) cast. */ setinputstring((char *)ps); saveprompt = doprompt; doprompt = 0; + result = ps; + + SAVE_INT(saveint); + if ((err=setjmp(jmploc.loc))) + goto out; /* readtoken1() might die horribly. * Try a prompt with syntactically wrong command: * PS1='$(date "+%H:%M:%S) > ' */ - 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; - - /* Try: PS1='`xxx(`' */ - unwindfiles(file_stop); + exception_handler = &jmploc; + readtoken1(pgetc(), syntax_type, FAKEEOFMARK, 0); n.narg.type = NARG; n.narg.next = NULL; @@ -13130,17 +13127,20 @@ expandstr(const char *ps, int syntax_type) /* expandarg() might fail too: * PS1='$((123+))' */ - SAVE_INT(saveint); - if (setjmp(jmploc.loc) == 0) { - exception_handler = &jmploc; - expandarg(&n, NULL, EXP_QUOTED); - } else if (exception_type == EXEXIT) { - exitshell(); - } + expandarg(&n, NULL, EXP_QUOTED); + result = stackblock(); + +out: exception_handler = savehandler; + if (err && exception_type != EXERROR) + longjmp(exception_handler->loc, 1); RESTORE_INT(saveint); - return stackblock(); + doprompt = saveprompt; + /* Try: PS1='`xxx(`' */ + unwindfiles(file_stop); + + return result; } static inline int -- 2.24.1 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
