From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21670 invoked by alias); 24 Apr 2018 09:43:48 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: List-Unsubscribe: X-Seq: 42708 Received: (qmail 19766 invoked by uid 1010); 24 Apr 2018 09:43:47 -0000 X-Qmail-Scanner-Diagnostics: from mailout2.w1.samsung.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(210.118.77.12):SA:0(-6.9/5.0):. Processed in 1.564595 secs); 24 Apr 2018 09:43:47 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_HI, SPF_HELO_PASS,SPF_PASS,T_DKIMWL_WL_HIGH,T_DKIM_INVALID autolearn=ham autolearn_force=no version=3.4.1 X-Envelope-From: p.stephenson@samsung.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20180424094339euoutp02ca971ee9cd6c1fbe789c8e7b8a36510c~oVf0tmPkO2133421334euoutp02L DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1524563019; bh=bCbX/e9krx2S+FxmT2/nHvqRhOgfSswZXTpSvp4hLzw=; h=Date:From:To:Subject:In-reply-to:References:From; b=ejBHlSFCYo1qr+Pg4KJjW5vE1sYn7LU6SIld7mUBLuNDZxv4IJ1HCMz0EGgTZ4o6D o6RMCG5OatrmelW9FwRtNAxOh3zZKxEySfwqthhK9izBzCi9C36c4XFG63/dHvUFWJ I3+AXQlwq4SrT4IJkO9SYaKZMba5KvAzOtD3n3Vs= X-AuditID: cbfec7f4-b4fc79c0000043e4-0d-5adefc493b8f Date: Tue, 24 Apr 2018 10:43:35 +0100 From: Peter Stephenson To: zsh-workers@zsh.org Subject: Re: [BUG] process substitution breaks when nested or traverses a function Message-id: <20180424104335.24dfe68e@camnpupstephen.cam.scsc.local> In-reply-to: Organization: SCSC X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; x86_64-pc-linux-gnu) MIME-version: 1.0 Content-type: text/plain; charset="UTF-8" Content-transfer-encoding: quoted-printable X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrCIsWRmVeSWpSXmKPExsWy7djP87qef+5FGfxoMLc42PyQyYHRY9XB D0wBjFFcNimpOZllqUX6dglcGfdWdjMWLFCt+LIgqYHxm0wXIyeHhICJxO+2drYuRi4OIYEV jBJvF39ngXB6mSQmvj7FDlP1ZMdcVojEMkaJEyffsIAkhASmMUk8uF0OkTjDKDFz+UEmCOcC o8Te7ufMIFUsAqoSt9c2sIHYbAKGElM3zWYEsUUExCXOrj0PNklYIETi3d4vYDW8As4S7zc8 AVvNKRAs8eJgG1ANBwe/gJDEhWZbiIvsJY7uOckEUS4o8WPyPbAxzAKaElt3r2eHsLUlnry7 AHa1hMAMNonZK6+xQjS7SHQeWwX1mrDEq+NboGwZicuTu1kgGpoZJdbev88GkehhlJi1OBTC tpbou32REWIDn8SkbdOZQY6TEOCV6GgTgijxkDh1dhozhO0oMWfLbWiYLgEGSucNtgmM8rOQ HD4LyeGzkBy+gJF5FaN4amlxbnpqsVFearlecWJucWleul5yfu4mRmDcn/53/MsOxl1/kg4x CnAwKvHw/vh9N0qINbGsuDL3EKMEB7OSCO9euXtRQrwpiZVVqUX58UWlOanFhxilOViUxHnj NOqihATSE0tSs1NTC1KLYLJMHJxSDYzlQWtqF3s46qx27hNSFbi/4R9rb+b96UqBIQuSThx8 3vrVOsRwAd/Oc4o2/y91uX3+F7xJsrAp9VJ17n4j18Nvec3Y01oXrbzMZTunSZ9z3sUFy87N 3JDJmzB5e+jMzKcZT+6xzHx4eLncN4tix0Uz2BUmnf/5rS9ZbDXDxmtKxw1Mql89+SulxFKc kWioxVxUnAgA63Z/5/cCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrELMWRmVeSWpSXmKPExsVy+t/xq7qef+5FGUz/xWpxsPkhkwOjx6qD H5gCGKO4bFJSczLLUov07RK4Mu6t7GYsWKBa8WVBUgPjN5kuRk4OCQETiSc75rJ2MXJxCAks YZS4v/E6G0hCSGAGk0TL8lKIxDlGicnPFrBAOBcYJc6u6GIFqWIRUJW4vbYBrINNwFBi6qbZ jCC2iIC4xNm151lAbGGBEIl3e7+A1fAKOEu83/CEHcTmFAiW2PDhLzvE0GWMEjM+rgIq4uDg FxCSuNBsC3GevcTRPSeZIHoFJX5Mvgc2k1lAXWLSvEXMELa2xJN3F1ghrlaXuHF3N/sERqFZ SFpmIWmZhaRlASPzKkaR1NLi3PTcYiO94sTc4tK8dL3k/NxNjMCQ3Xbs55YdjF3vgg8xCnAw KvHw/vh9N0qINbGsuDL3EKMEB7OSCO9euXtRQrwpiZVVqUX58UWlOanFhxilOViUxHnPG1RG CQmkJ5akZqemFqQWwWSZODilGhij3Xz+H1j3803Q2dJdB0/MfRa3S8Ek69gf6So/jbgLwU8N PbOF3+/kP8mbGqvPYuN1ZM6qzAalySrr93++tnk+35qCZ49te06u2el5nnUNJ7/OH37L70Wq 12c8O2gidPtUVvQqE7b9Sg+mLEuvb3+nvGml9F4u3bkZQnmCG9/su6O3sUNcQd5EiaU4I9FQ i7moOBEA4HH3I1UCAAA= X-CMS-MailID: 20180424094337eucas1p2c7c9764359411edc9a9b95bb1375a266 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20180421093602epcas1p4c7f4182661b42fa2e477f8fe61a3e132 X-RootMTR: 20180421093602epcas1p4c7f4182661b42fa2e477f8fe61a3e132 References: On Sat, 21 Apr 2018 06:35:23 -0300 Francisco de Zuvir=C3=ADa Allende wrote: > #!/bin/zsh > foo() { cat <(cat "$@"); }; foo <(echo bar); > cat: /proc/self/fd/11: No such file or directory Files and file descriptors for process substitution are handled specially, so shouldn't be tidied up by closem(), which is called on the inner process substitution (that's why both were required for this to show up). Is there a better way of doing this; or is this patch overkill, or not careful enough...? If we don't have /proc/self, tidying up is done only with the job filelist, so there wouldn't be a problem. But the get out "all" argument looks like a reasonable safety compromise. pws diff --git a/Src/Modules/clone.c b/Src/Modules/clone.c index 9304292..ef6275d 100644 --- a/Src/Modules/clone.c +++ b/Src/Modules/clone.c @@ -69,7 +69,7 @@ bin_clone(char *nam, char **args, UNUSED(Options ops), UN= USED(int func)) dup2(ttyfd,2); if (ttyfd > 2) close(ttyfd); - closem(0); + closem(FDT_UNUSED, 0); close(coprocin); close(coprocout); /* Acquire a controlling terminal */ diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c index 1c93a1d..2f83f7c 100644 --- a/Src/Modules/zpty.c +++ b/Src/Modules/zpty.c @@ -400,7 +400,7 @@ newptycmd(char *nam, char *pname, char **args, int echo= , int nblock) dup2(slave, 1); dup2(slave, 2); =20 - closem(0); + closem(FDT_UNUSED, 0); close(slave); close(master); close(coprocin); diff --git a/Src/exec.c b/Src/exec.c index e853aff..65139de 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -698,7 +698,7 @@ execute(LinkList args, int flags, int defpath) * Note that we don't close fd's attached to process substitution * here, which should be visible to external processes. */ - closem(FDT_XTRACE); + closem(FDT_XTRACE, 0); #ifndef FD_CLOEXEC if (SHTTY !=3D -1) { close(SHTTY); @@ -3924,7 +3924,7 @@ execcmd_exec(Estate state, Execcmd_params eparams, LinkList assigns =3D (LinkList)0; int postassigns =3D eparams->postassigns; if (forked) - closem(FDT_INTERNAL); + closem(FDT_INTERNAL, 0); if (postassigns) { Wordcode opc =3D state->pc; state->pc =3D eparams->assignspc; @@ -4110,7 +4110,7 @@ execcmd_exec(Estate state, Execcmd_params eparams, if (errflag) _exit(1); } - closem(FDT_INTERNAL); + closem(FDT_INTERNAL, 0); if (coprocin !=3D -1) { zclose(coprocin); coprocin =3D -1; @@ -4172,7 +4172,7 @@ execcmd_exec(Estate state, Execcmd_params eparams, for (i =3D 0; i < 10; i++) if (fdtable[i] !=3D FDT_UNUSED) close(i); - closem(FDT_UNUSED); + closem(FDT_UNUSED, 1); if (thisjob !=3D -1) waitjobs(); _exit(lastval); @@ -4352,12 +4352,17 @@ fixfds(int *save) =20 /**/ mod_export void -closem(int how) +closem(int how, int all) { int i; =20 for (i =3D 10; i <=3D max_zsh_fd; i++) if (fdtable[i] !=3D FDT_UNUSED && + /* + * Process substitution needs to be visible to user; + * fd's are explicitly cleaned up by filelist handling. + */ + (all || fdtable[i] !=3D FDT_PROC_SUBST) && (how =3D=3D FDT_UNUSED || (fdtable[i] & FDT_TYPE_MASK) =3D=3D how)) { if (i =3D=3D SHTTY) SHTTY =3D -1; @@ -4840,7 +4845,7 @@ getproc(char *cmd, char **eptr) addproc(pid, NULL, 1, &bgtime); return pnam; } - closem(FDT_UNUSED); + closem(FDT_UNUSED, 0); fd =3D open(pnam, out ? O_WRONLY | O_NOCTTY : O_RDONLY | O_NOCTTY); if (fd =3D=3D -1) { zerr("can't open %s: %e", pnam, errno); @@ -4879,7 +4884,7 @@ getproc(char *cmd, char **eptr) } entersubsh(ESUB_ASYNC|ESUB_PGRP); redup(pipes[out], out); - closem(FDT_UNUSED); /* this closes pipes[!out] as well */ + closem(FDT_UNUSED, 0); /* this closes pipes[!out] as well */ #endif /* PATH_DEV_FD */ =20 cmdpush(CS_CMDSUBST); @@ -4929,7 +4934,7 @@ getpipe(char *cmd, int nullexec) } entersubsh(ESUB_PGRP); redup(pipes[out], out); - closem(FDT_UNUSED); /* this closes pipes[!out] as well */ + closem(FDT_UNUSED, 0); /* this closes pipes[!out] as well */ cmdpush(CS_CMDSUBST); execode(prog, 0, 1, out ? "outsubst" : "insubst"); cmdpop(); diff --git a/Test/D03procsubst.ztst b/Test/D03procsubst.ztst index ca8d56f..861aa9c 100644 --- a/Test/D03procsubst.ztst +++ b/Test/D03procsubst.ztst @@ -149,3 +149,10 @@ fi 0:proc subst fd in forked subshell closed in parent (external command) >1 1 + + procfunc() { + cat <(cat "$@") + } + procfunc <(echo argument) +0:With /proc/self file descriptors must not be tidied up too early +>argument