From 17fb014dc7984902a6697c6412b0cca55300542b Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 7 Mar 2016 09:42:21 +0000 Subject: 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. --- ChangeLog | 6 ++++++ Src/signals.c | 7 ++++++- Test/C03traps.ztst | 22 ++++++++++++++++++++-- 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 + + * 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 * 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 -- cgit 1.4.1