summaryrefslogtreecommitdiff
path: root/Src/exec.c
diff options
context:
space:
mode:
authorPeter Stephenson <p.w.stephenson@ntlworld.com>2013-12-21 17:41:21 -0800
committerBarton E. Schaefer <schaefer@zsh.org>2013-12-21 17:41:21 -0800
commitaede5c52bf557f89d1d09fa5430186af6e295241 (patch)
tree69cc4ddf97f2a93b10312e94698eedfc6f501aa5 /Src/exec.c
parent634c03c76d15c0aafa945feb5e80a50738e496c3 (diff)
downloadzsh-aede5c52bf557f89d1d09fa5430186af6e295241.tar.gz
zsh-aede5c52bf557f89d1d09fa5430186af6e295241.zip
32176: plug additional deadlock-inducing pipe descriptor leaks
Diffstat (limited to 'Src/exec.c')
-rw-r--r--Src/exec.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/Src/exec.c b/Src/exec.c
index 44800339f..f16cfd391 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -2389,7 +2389,7 @@ static void
execcmd(Estate state, int input, int output, int how, int last1)
{
HashNode hn = NULL;
- LinkList args;
+ LinkList args, filelist = NULL;
LinkNode node;
Redir fn;
struct multio *mfds[10];
@@ -2911,6 +2911,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
flags |= ESUB_KEEPTRAP;
if (type == WC_SUBSH && !(how & Z_ASYNC))
flags |= ESUB_JOB_CONTROL;
+ filelist = jobtab[thisjob].filelist;
entersubsh(flags);
close(synch[1]);
forked = 1;
@@ -3264,6 +3265,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
if (is_shfunc) {
/* It's a shell function */
+ pipecleanfilelist(filelist);
execshfunc((Shfunc) hn, args);
} else {
/* It's a builtin */
@@ -3342,6 +3344,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
DPUTS(varspc,
"BUG: assignment before complex command");
list_pipe = 0;
+ pipecleanfilelist(filelist);
/* If we're forked (and we should be), no need to return */
DPUTS(last1 != 1 && !forked, "BUG: not exiting?");
DPUTS(type != WC_SUBSH, "Not sure what we're doing.");