From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15893 invoked by alias); 20 Jan 2015 09:36:46 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 19754 Received: (qmail 14893 invoked from network); 20 Jan 2015 09:36:33 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) 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 autolearn=ham version=3.3.2 From: Kamil Dudka To: Peter Stephenson Cc: zsh-users@zsh.org Subject: Re: warning about closing an already closed file descriptor Date: Tue, 20 Jan 2015 10:36:21 +0100 Message-ID: <74839624.fYcXcXKno9@kdudka.brq.redhat.com> User-Agent: KMail/4.14.3 (Linux/3.17.8-300.fc21.x86_64; KDE/4.14.3; x86_64; ; ) In-Reply-To: <20150119172850.1bffc197@pwslap01u.europe.root.pri> References: <1469711.vAe1BPIYVt@kdudka.brq.redhat.com> <20150119145935.5eee77ee@pwslap01u.europe.root.pri> <20150119172850.1bffc197@pwslap01u.europe.root.pri> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 On Monday 19 January 2015 17:28:50 Peter Stephenson wrote: > On Mon, 19 Jan 2015 14:59:35 +0000 > > Peter Stephenson wrote: > > The problem that change fixed wasn't really intended to have a visible > > effect, apart from closing f.d.s the shell didn't know about. If it's > > more useful without the message than with it, it can be removed. > > > >... > > > > We can special case the {varid}<&- syntax --- that might be useful since > > it implies the user was previously in direct control of the f.d. so is > > ikely to be interested in an error if closing it failed. > > This easy patch does that. Is anyone other than Kamil interested enough > to comment? > > pws > > diff --git a/Src/exec.c b/Src/exec.c > index f42fb2b..3b0e936 100644 > --- a/Src/exec.c > +++ b/Src/exec.c > @@ -3203,7 +3203,12 @@ execcmd(Estate state, int input, int output, int how, > int last1) } > if (fn->fd1 < 10) > closemn(mfds, fn->fd1, REDIR_CLOSE); > - if (!closed && zclose(fn->fd1) < 0) { > + /* > + * Only report failures to close file descriptors > + * if they're under user control as we don't know > + * what the previous status of others was. > + */ > + if (!closed && zclose(fn->fd1) < 0 && fn->varid) { > zwarn("failed to close file descriptor %d: %e", > fn->fd1, errno); > } Looks reasonable and fixes the problem for me. Thanks for the patch! Kamil > diff --git a/Test/A04redirect.ztst b/Test/A04redirect.ztst > index a39ce46..cb67788 100644 > --- a/Test/A04redirect.ztst > +++ b/Test/A04redirect.ztst > @@ -152,11 +152,13 @@ > > >hello > >goodbye > > - ({ exec 3<&- } 2>/dev/null > - exec 3<&- > - read foo <&-) > + (exec {varid}<&0 > + exec {varid}<&- > + print About to close a second time >&2 > + read {varid}<&-) > 1:'<&-' redirection > -*?\(eval\):*: failed to close file descriptor 3:* > +?About to close a second time > +*?\(eval\):*: failed to close file descriptor * > > print foo >&- > 0:'>&-' redirection