diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2005-04-27 10:03:14 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2005-04-27 10:03:14 +0000 |
commit | 24aed1f2b1790f4ed6defac392230a6aa1f37dfd (patch) | |
tree | b708f5292afc5cf561d88b0bdc4972ac9d345d9c /Src | |
parent | 0b136fcaf4fccab44a43ba171623d3b2ed402ac3 (diff) | |
download | zsh-24aed1f2b1790f4ed6defac392230a6aa1f37dfd.tar.gz zsh-24aed1f2b1790f4ed6defac392230a6aa1f37dfd.tar.xz zsh-24aed1f2b1790f4ed6defac392230a6aa1f37dfd.zip |
21197: Fix LOCAL_TRAPS inside another trap
Diffstat (limited to 'Src')
-rw-r--r-- | Src/exec.c | 6 | ||||
-rw-r--r-- | Src/signals.c | 9 |
2 files changed, 10 insertions, 5 deletions
diff --git a/Src/exec.c b/Src/exec.c index 24355d275..2db264435 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -3544,8 +3544,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)) @@ -3645,8 +3644,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 e5225b6c5..8b70c880a 100644 --- a/Src/signals.c +++ b/Src/signals.c @@ -862,6 +862,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 @@ -891,8 +895,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 { |