ash: improve expandstr()
No binary (build failed)
—
(log yok)
| @@ -13098,29 +13098,27 @@ 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); |
| + | err = setjmp(jmploc.loc); |
| + | if (err) |
| + | 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 +13128,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 | |