Applied, thanks!
On Thu, Jan 23, 2020 at 12:26 PM Ron Yorston <[email protected]> wrote: > > 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 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
