diff options
Diffstat (limited to 'bin')
-rw-r--r-- | bin/sh/eval.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/bin/sh/eval.c b/bin/sh/eval.c index 5bae2f2..596a86c 100644 --- a/bin/sh/eval.c +++ b/bin/sh/eval.c @@ -578,6 +578,8 @@ evalbackcmd(union node *n, struct backcmd *result) int pip[2]; struct job *jp; struct stackmark smark; /* unnecessary */ + struct jmploc jmploc; + struct jmploc *savehandler; setstackmark(&smark); result->fd = -1; @@ -590,7 +592,19 @@ evalbackcmd(union node *n, struct backcmd *result) } if (n->type == NCMD) { exitstatus = oexitstatus; - evalcommand(n, EV_BACKCMD, result); + savehandler = handler; + if (setjmp(jmploc.loc)) { + if (exception == EXERROR || exception == EXEXEC) + exitstatus = 2; + else if (exception != 0) { + handler = savehandler; + longjmp(handler->loc, 1); + } + } else { + handler = &jmploc; + evalcommand(n, EV_BACKCMD, result); + } + handler = savehandler; } else { exitstatus = 0; if (pipe(pip) < 0) |