diff options
Diffstat (limited to '')
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | src/error.c | 1 | ||||
-rw-r--r-- | src/eval.c | 22 |
3 files changed, 10 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog index 81aba60..9a601df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * Fix use-after-free in dotrap/evalstring. * Make sure evalskip is zero before running traps. + * Set exitstatus in onint. 2014-09-29 Herbert Xu <herbert@gondor.apana.org.au> diff --git a/src/error.c b/src/error.c index 9d31989..f9ea919 100644 --- a/src/error.c +++ b/src/error.c @@ -105,6 +105,7 @@ onint(void) { signal(SIGINT, SIG_DFL); raise(SIGINT); } + exitstatus = SIGINT + 128; exraise(EXINT); /* NOTREACHED */ } diff --git a/src/eval.c b/src/eval.c index 7f06931..0708bf5 100644 --- a/src/eval.c +++ b/src/eval.c @@ -853,21 +853,15 @@ bail: listsetvar(varlist.list, VEXPORT); } if (evalbltin(cmdentry.u.cmd, argc, argv, flags)) { - int status; - int i; - - i = exception; - if (i == EXEXIT) - goto raise; - - status = (i == EXINT) ? SIGINT + 128 : 2; - exitstatus = status; - - if (i == EXINT || spclbltin > 0) { -raise: - longjmp(handler->loc, 1); + if (exception == EXERROR) { + exitstatus = 2; + if (spclbltin <= 0) { + FORCEINTON; + break; + } } - FORCEINTON; +raise: + longjmp(handler->loc, 1); } break; |