about summary refs log tree commit diff
path: root/Src/signals.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2005-04-27 09:58:42 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2005-04-27 09:58:42 +0000
commit2c208c7743e240d155b2650f74c374ecab08644f (patch)
treec4dadb93283950a958a5fa464230137c420862f1 /Src/signals.c
parentf49c66fc6af5293464a89b9c7e448ebf7dc60602 (diff)
downloadzsh-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.c9
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 {