diff options
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | src/eval.c | 6 | ||||
-rw-r--r-- | src/trap.c | 11 |
3 files changed, 14 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index a56fc5e..81aba60 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ 2014-10-02 Herbert Xu <herbert@gondor.apana.org.au> * Fix use-after-free in dotrap/evalstring. + * Make sure evalskip is zero before running traps. 2014-09-29 Herbert Xu <herbert@gondor.apana.org.au> diff --git a/src/eval.c b/src/eval.c index 3cfa1e5..7f06931 100644 --- a/src/eval.c +++ b/src/eval.c @@ -197,6 +197,9 @@ evaltree(union node *n, int flags) TRACE(("evaltree(NULL) called\n")); goto out; } + + dotrap(); + #ifndef SMALL displayhist = 1; /* show history substitutions done with fc */ #endif @@ -308,8 +311,7 @@ out: if (checkexit & exitstatus) goto exexit; - if (pendingsigs) - dotrap(); + dotrap(); if (flags & EV_EXIT) { exexit: diff --git a/src/trap.c b/src/trap.c index 17316c9..e34e0f8 100644 --- a/src/trap.c +++ b/src/trap.c @@ -316,6 +316,9 @@ void dotrap(void) int i; int savestatus; + if (!pendingsigs) + return; + savestatus = exitstatus; pendingsigs = 0; barrier(); @@ -323,6 +326,12 @@ void dotrap(void) for (i = 0, q = gotsig; i < NSIG - 1; i++, q++) { if (!*q) continue; + + if (evalskip) { + pendingsigs = i + 1; + break; + } + *q = 0; p = trap[i + 1]; @@ -330,8 +339,6 @@ void dotrap(void) continue; evalstring(p, 0); exitstatus = savestatus; - if (evalskip) - break; } } |