diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2014-10-02 21:07:55 +0800 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2014-10-02 21:07:55 +0800 |
commit | b4ce4120f87d89476b2d6ab31df43900d2f5ce89 (patch) | |
tree | f4f0e892d1987f9119be2892fee0fa3749523c10 | |
parent | [TRAP] Make sure evalskip is zero before running traps (diff) | |
download | dash-b4ce4120f87d89476b2d6ab31df43900d2f5ce89.tar.gz dash-b4ce4120f87d89476b2d6ab31df43900d2f5ce89.zip |
[ERROR] Set exitstatus in onint
Currently the exit status when we receive SIGINT is set in evalcommand which means that it doesn't always get set. For example, if you press CTRL-C at the prompt of an interactive dash, the exit status is not set to 130 as it is in many other Bourne shells. This patch fixes this by moving the setting of the exit status into onint which also simplifies evalcommand. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-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; |