diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2018-12-14 13:52:02 +0800 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2019-02-25 12:52:11 +0800 |
commit | 62cf6955f8abe875752d7163f6f3adbc7e49ebae (patch) | |
tree | 9e00ec01755501a903f7623b1f1ffd09646298dc /src/eval.c | |
parent | eval: avoid leaking memory associated with redirections (diff) | |
download | dash-62cf6955f8abe875752d7163f6f3adbc7e49ebae.tar.gz dash-62cf6955f8abe875752d7163f6f3adbc7e49ebae.zip |
eval: Only restore exit status on exit/return
We unconditionally restore the saved status in exitreset, which is incorrect as we only want to do it for exitcmd and returncmd. This patch fixes the problem by introducing EXEND. Reported-by: Martijn Dekker <martijn@inlv.org> Fixes: da30b4b78769 ("[BUILTIN] Exit without arguments in a trap...") Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to '')
-rw-r--r-- | src/eval.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/eval.c b/src/eval.c index 6a65d00..514922e 100644 --- a/src/eval.c +++ b/src/eval.c @@ -114,12 +114,13 @@ STATIC const struct builtincmd bltin = { INCLUDE "eval.h" EXITRESET { - evalskip = 0; - loopnest = 0; if (savestatus >= 0) { - exitstatus = savestatus; + if (exception == EXEXIT || evalskip == SKIPFUNCDEF) + exitstatus = savestatus; savestatus = -1; } + evalskip = 0; + loopnest = 0; } #endif @@ -318,7 +319,7 @@ out: if (flags & EV_EXIT) { exexit: - exraise(EXEXIT); + exraise(EXEND); } popstackmark(&smark); |