about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2016-03-07 09:42:21 +0000
committerPeter Stephenson <pws@zsh.org>2016-03-07 09:42:21 +0000
commit17fb014dc7984902a6697c6412b0cca55300542b (patch)
tree0fcae721ebf4ea22a2258b26712b14b74d71d4e2
parentbc958ab27591f3bb717efeb95fa541ee14a2405b (diff)
downloadzsh-17fb014dc7984902a6697c6412b0cca55300542b.tar.gz
zsh-17fb014dc7984902a6697c6412b0cca55300542b.tar.xz
zsh-17fb014dc7984902a6697c6412b0cca55300542b.zip
38094: Fix POSIX EXIT traps defined in function.
These aren't local, so set the local level to 0; else they can get
overridden incorrectly.
-rw-r--r--ChangeLog6
-rw-r--r--Src/signals.c7
-rw-r--r--Test/C03traps.ztst22
3 files changed, 32 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index b9d34e430..52299a364 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-07  Peter Stephenson  <p.stephenson@samsung.com>
+
+	* 38094: Src/signals.c, Test/C03traps.ztst: POSIX exit traps
+	aren't local so local level should be 0 so they don't
+	get trashed if defined in a function.
+
 2016-03-06  Barton E. Schaefer  <schaefer@zsh.org>
 
 	* 38106: Src/parse.c: if...then if...else should be a parse error.
diff --git a/Src/signals.c b/Src/signals.c
index 1344395f7..2eefc07de 100644
--- a/Src/signals.c
+++ b/Src/signals.c
@@ -877,16 +877,21 @@ settrap(int sig, Eprog l, int flags)
             sig != SIGCHLD)
             install_handler(sig);
     }
+    sigtrapped[sig] |= flags;
     /*
      * Note that introducing the locallevel does not affect whether
      * sigtrapped[sig] is zero or not, i.e. a test without a mask
      * works just the same.
      */
-    sigtrapped[sig] |= (locallevel << ZSIG_SHIFT) | flags;
     if (sig == SIGEXIT) {
 	/* Make POSIX behaviour of EXIT trap sticky */
 	exit_trap_posix = isset(POSIXTRAPS);
+	/* POSIX exit traps are not local. */
+	if (!exit_trap_posix)
+	    sigtrapped[sig] |= (locallevel << ZSIG_SHIFT);
     }
+    else
+	sigtrapped[sig] |= (locallevel << ZSIG_SHIFT);
     unqueue_signals();
     return 0;
 }
diff --git a/Test/C03traps.ztst b/Test/C03traps.ztst
index f4466b556..83c05aa08 100644
--- a/Test/C03traps.ztst
+++ b/Test/C03traps.ztst
@@ -429,14 +429,32 @@
      fn
      echo exiting program
    ')
-0:POSX EXIT trap can have nested native mode EXIT trap
+0:POSIX EXIT trap can have nested native mode EXIT trap
 >entering program
 >entering native zsh function
 >native zsh function-local exit trap triggered
 >exiting program
 >POSIX exit trap triggered
 
-   (set -e
+   (cd ..; $ZTST_exe -fc '
+     echo entering program
+     emulate sh -c '\''spt() { trap "echo POSIX exit trap triggered" EXIT; }'\''
+     fn() {
+	trap "echo native zsh function-local exit trap triggered" EXIT
+	echo entering native zsh function
+     }
+     spt
+     fn
+     echo exiting program
+   ')
+0:POSIX EXIT trap not replaced if defined within function
+>entering program
+>entering native zsh function
+>native zsh function-local exit trap triggered
+>exiting program
+>POSIX exit trap triggered
+
+    (set -e
     printf "a\nb\n" | while read line
     do
        [[ $line = a* ]] || continue