diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2005-04-27 09:58:42 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2005-04-27 09:58:42 +0000 |
commit | 2c208c7743e240d155b2650f74c374ecab08644f (patch) | |
tree | c4dadb93283950a958a5fa464230137c420862f1 /Src/signals.c | |
parent | f49c66fc6af5293464a89b9c7e448ebf7dc60602 (diff) | |
download | zsh-2c208c7743e240d155b2650f74c374ecab08644f.tar.gz zsh-2c208c7743e240d155b2650f74c374ecab08644f.tar.xz zsh-2c208c7743e240d155b2650f74c374ecab08644f.zip |
21197: Fix LOCAL_TRAPS inside another trap
Diffstat (limited to 'Src/signals.c')
-rw-r--r-- | Src/signals.c | 9 |
1 files changed, 8 insertions, 1 deletions
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 { |