about summary refs log tree commit diff
path: root/Src/exec.c
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@zsh.org>2022-12-13 21:11:33 -0800
committerBart Schaefer <schaefer@zsh.org>2022-12-13 21:11:33 -0800
commit6d49734d46a66b572cf064f60dac8d9e0ad309d0 (patch)
tree16ec8ac27550c244ae75e1490a271e5b5dc3ea2e /Src/exec.c
parent727079f7e547fe17e73fa6e240fe5c07ab01abe9 (diff)
downloadzsh-6d49734d46a66b572cf064f60dac8d9e0ad309d0.tar.gz
zsh-6d49734d46a66b572cf064f60dac8d9e0ad309d0.tar.xz
zsh-6d49734d46a66b572cf064f60dac8d9e0ad309d0.zip
51210: Clear errflag before calling EXIT trap
If this is not done, special cases such as failures in special builtins
or errors in math expressions skip the trap execution.
Diffstat (limited to 'Src/exec.c')
-rw-r--r--Src/exec.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/Src/exec.c b/Src/exec.c
index 7001fd615..2b7e0c7c5 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -1598,6 +1598,7 @@ sublist_done:
 			       (isset(ERRRETURN) && !errreturn)) &&
 		    !(noerrexit & NOERREXIT_EXIT);
 		if (errexit) {
+		    errflag = 0;
 		    if (sigtrapped[SIGEXIT])
 			dotrap(SIGEXIT);
 		    if (mypid != getpid())
@@ -1630,9 +1631,12 @@ sublist_done:
 	thisjob = cj;
 
     if (exiting && sigtrapped[SIGEXIT]) {
+	int eflag = errflag;
+	errflag = 0;	/* Clear the context for trap */
 	dotrap(SIGEXIT);
 	/* Make sure this doesn't get executed again. */
 	sigtrapped[SIGEXIT] = 0;
+	errflag = eflag;
     }
 
     unqueue_signals();