summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/exec.c6
-rw-r--r--Src/signals.c9
2 files changed, 10 insertions, 5 deletions
diff --git a/Src/exec.c b/Src/exec.c
index f5feba50b..515a41f9b 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -3669,8 +3669,7 @@ doshfunc(char *name, Eprog prog, LinkList doshargs, int flags, int noreturnval)
memcpy(oldpipestats, pipestats, bytes);
}
- if (!intrap)
- starttrapscope();
+ starttrapscope();
tab = pparams;
if (!(flags & PM_UNDEFINED))
@@ -3770,8 +3769,7 @@ doshfunc(char *name, Eprog prog, LinkList doshargs, int flags, int noreturnval)
opts[LOCALOPTIONS] = saveopts[LOCALOPTIONS];
}
- if (!intrap)
- endtrapscope();
+ endtrapscope();
if (trapreturn < -1)
trapreturn++;
diff --git a/Src/signals.c b/Src/signals.c
index d1e6f22fe..e9571ef5b 100644
--- a/Src/signals.c
+++ b/Src/signals.c
@@ -888,6 +888,10 @@ removetrap(int sig)
void
starttrapscope(void)
{
+ /* No special SIGEXIT behaviour inside another trap. */
+ if (intrap)
+ return;
+
/*
* SIGEXIT needs to be restored at the current locallevel,
* so give it the next higher one. dosavetrap() is called
@@ -917,8 +921,11 @@ endtrapscope(void)
/*
* Remember the exit trap, but don't run it until
* after all the other traps have been put back.
+ * Don't do this inside another trap.
*/
- if ((exittr = sigtrapped[SIGEXIT])) {
+ if (intrap)
+ exittr = 0;
+ else if ((exittr = sigtrapped[SIGEXIT])) {
if (exittr & ZSIG_FUNC) {
exitfn = removehashnode(shfunctab, "TRAPEXIT");
} else {