about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBarton E. Schaefer <schaefer@zsh.org>2013-10-27 15:42:00 -0700
committerBarton E. Schaefer <schaefer@zsh.org>2013-10-27 15:42:00 -0700
commitc98cbe25d2be2c8c552250e7e039a72e1f61887b (patch)
treef90413329d54c3627baac925951e5d2b0bcc08cd
parent4748eff7d2e97ff652f5d75d33b9aad12d7d917f (diff)
downloadzsh-c98cbe25d2be2c8c552250e7e039a72e1f61887b.tar.gz
zsh-c98cbe25d2be2c8c552250e7e039a72e1f61887b.tar.xz
zsh-c98cbe25d2be2c8c552250e7e039a72e1f61887b.zip
31919: fix deadlock when a shell builtin with a multio redirection is used on the left side of a pipeline
Make sure stdin/out/err file descriptors are closed for the multio copy
process, which means not re-using those descriptors after they are closed
and marked FDT_UNUSED in fdtable[].  For completeness, initialize their
fdtable[] state to FDT_EXTERNAL.
-rw-r--r--ChangeLog17
-rw-r--r--Src/exec.c4
-rw-r--r--Src/init.c1
3 files changed, 15 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 659aba150..462ffdad6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,12 +1,19 @@
 2013-10-27  Barton E. Schaefer  <schaefer@zsh.org>
 
-	* unposted (cf. users/18063): Functions/Zle/keeper: clean up
-	some syntax nits, add working link to old Unix Review article
-
 	* 31912: Src/exec.c: in closemn(), distinguish closing for >&-
 	from closing for a real redirect.  Fixes knock-on multios bug
 	introduced by workers/20666 way back in 2005.
 
+	* unposted (cf. users/18063): Functions/Zle/keeper: clean up
+	some syntax nits, add working link to old Unix Review article
+
+	* 31919: Src/exec.c, Src/init.c: fix deadlock when a shell builtin
+	with a multio redirection is used on the left side of a pipeline,
+	by making sure stdin/out/err file descriptors are closed for the
+	multio copy process, which means not re-using those descriptors
+	after they are closed and marked FDT_UNUSED in fdtable[].  For
+	completeness, initialize their fdtable[] state to FDT_EXTERNAL.
+
 2013-10-27  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
 	* 31909: Jun T: Completion/Unix/Command/_cat: new completion.
@@ -146,7 +153,7 @@
 	internal history from the HISTFILE at write time.
 
 	* 31832: Src/exec.c: make execrestore() more signal-safe.
-	
+
 2013-10-17  Peter Stephenson  <p.stephenson@samsung.com>
 
 	* 31830: Doc/Zsh/func.yo, README, Src/hist.c, Src/zsh.h:
@@ -247,7 +254,7 @@
 	a listing, treat the separator as part of the description rather
 	than as part of the match, and account for lines that have already
 	wrapped due to very long matches.
-	
+
 	* 31781: Src/Zle/computil.c: "compdescribe -i" must clear the
 	completion list column padding width along with the rest of the
 	description state.  Cf. 31782.
diff --git a/Src/exec.c b/Src/exec.c
index 99c7eaa6a..df915e152 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -3123,7 +3123,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
 		    int fd = fn->fd2;
 		    if(fd == -2)
 			fd = (fn->type == REDIR_MERGEOUT) ? coprocout : coprocin;
-		    fil = dup(fd);
+		    fil = movefd(dup(fd));
 		}
 		if (fil == -1) {
 		    char fdstr[4];
@@ -3151,7 +3151,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
 		else
 		    fil = clobber_open(fn);
 		if(fil != -1 && IS_ERROR_REDIR(fn->type))
-		    dfil = dup(fil);
+		    dfil = movefd(dup(fil));
 		else
 		    dfil = 0;
 		if (fil == -1 || dfil == -1) {
diff --git a/Src/init.c b/Src/init.c
index 01a969df4..7032ff8ae 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -1584,6 +1584,7 @@ zsh_main(UNUSED(int argc), char **argv)
 
     fdtable_size = zopenmax();
     fdtable = zshcalloc(fdtable_size*sizeof(*fdtable));
+    fdtable[0] = fdtable[1] = fdtable[2] = FDT_EXTERNAL;
 
     createoptiontable();
     emulate(zsh_name, 1, &emulation, opts);   /* initialises most options */