summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2016-11-10 10:37:27 +0000
committerPeter Stephenson <pws@zsh.org>2016-11-10 10:37:27 +0000
commit5f1700755f12677b608adef88c39e08df99c41f2 (patch)
treec194e75d628380726e2649df40b70d41c6377beb
parent370b278565126a0abf3382ba10965e7a1090e7f8 (diff)
downloadzsh-5f1700755f12677b608adef88c39e08df99c41f2.tar.gz
zsh-5f1700755f12677b608adef88c39e08df99c41f2.tar.xz
zsh-5f1700755f12677b608adef88c39e08df99c41f2.zip
39901: No EXIT trap on LHS of pipeline.
There is a special case if the LHS is a shell construct.
Add unit tests for both cases.
-rw-r--r--ChangeLog5
-rw-r--r--Src/exec.c4
-rw-r--r--Test/C03traps.ztst17
3 files changed, 26 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index d7dc2d0a4..a9c47878b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-10  Peter Stephenson  <p.stephenson@samsung.com>
+
+	* 39901: Src/exec.c, Test/C03traps.ztst: Exiting the left hand
+	side of a pipeline shouldn't trigger EXIT trap.
+
 2016-11-09  Oliver Kiddle  <opk@zsh.org>
 
 	* 39890: Completion/Debian/Command/_git-buildpackage,
diff --git a/Src/exec.c b/Src/exec.c
index c0ed2c475..a01a633db 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -1888,6 +1888,10 @@ execpline2(Estate state, wordcode pcode,
 		entersubsh(((how & Z_ASYNC) ? ESUB_ASYNC : 0)
 			   | ESUB_PGRP | ESUB_KEEPTRAP);
 		close(synch[1]);
+		if (sigtrapped[SIGEXIT])
+		{
+		    unsettrap(SIGEXIT);
+		}
 		execcmd_exec(state, &eparams, input, pipes[1], how, 1);
 		_exit(lastval);
 	    }
diff --git a/Test/C03traps.ztst b/Test/C03traps.ztst
index 828a3d10f..c3bedb06c 100644
--- a/Test/C03traps.ztst
+++ b/Test/C03traps.ztst
@@ -641,6 +641,23 @@ F:Must be tested with a top-level script rather than source or function
 >TERM
 >EXIT
 
+  # Should not get "hello" in the single quotes.
+  (
+    trap "echo hello" EXIT;
+    { :; } | { read line; print "'$line'"; }
+  )
+0:EXIT trap not called in LHS of pipeline: Shell construct on LHS
+>''
+>hello
+
+  (
+    trap "echo hello" EXIT;
+    cat </dev/null | { read line; print "'$line'"; }
+  )
+0:EXIT trap not called in LHS of pipeline: External command on LHS
+>''
+>hello
+
 %clean
 
   rm -f TRAPEXIT