diff options
author | Peter Stephenson <pws@zsh.org> | 2015-07-23 09:34:11 +0100 |
---|---|---|
committer | Peter Stephenson <pws@zsh.org> | 2015-07-23 09:34:11 +0100 |
commit | 28a962f557952a6001d37f4f4f7034361d11bf89 (patch) | |
tree | 619000f12f12992f4521e99c05d170b235e6bfb2 /Src/exec.c | |
parent | 49ff2e00dc3787b3575f392f53d90774f1dbbdce (diff) | |
download | zsh-28a962f557952a6001d37f4f4f7034361d11bf89.tar.gz zsh-28a962f557952a6001d37f4f4f7034361d11bf89.tar.xz zsh-28a962f557952a6001d37f4f4f7034361d11bf89.zip |
35849: close fd's from process substitution after fork
Leaving these hanging in parent could cause deadlock: test added.
Diffstat (limited to 'Src/exec.c')
-rw-r--r-- | Src/exec.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/Src/exec.c b/Src/exec.c index 4eee82bf1..7612d4303 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -3047,6 +3047,7 @@ execcmd(Estate state, int input, int output, int how, int last1) addproc(pid, text, 0, &bgtime); if (oautocont >= 0) opts[AUTOCONTINUE] = oautocont; + pipecleanfilelist(jobtab[thisjob].filelist, 1); return; } /* pid == 0 */ @@ -3492,7 +3493,7 @@ execcmd(Estate state, int input, int output, int how, int last1) if (is_shfunc) { /* It's a shell function */ - pipecleanfilelist(filelist); + pipecleanfilelist(filelist, 0); execshfunc((Shfunc) hn, args); } else { /* It's a builtin */ @@ -3682,7 +3683,7 @@ execcmd(Estate state, int input, int output, int how, int last1) DPUTS(varspc, "BUG: assignment before complex command"); list_pipe = 0; - pipecleanfilelist(filelist); + pipecleanfilelist(filelist, 0); /* 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."); |