X-Spam-Check-By: sourceware.org Message-ID: <44EB6A8D.7010400@redhat.com> Date: Tue, 22 Aug 2006 16:35:25 -0400 From: Jeff Johnston User-Agent: Mozilla Thunderbird 1.0.7-1.1.fc4 (X11/20050929) MIME-Version: 1.0 To: Eric Blake Cc: newlib AT sources DOT redhat DOT com, cygwin AT cygwin DOT com Subject: Re: popen bug [patch] References: <44EB57F0 DOT 7020706 AT byu DOT net> In-Reply-To: <44EB57F0.7020706@byu.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Patch checked in. Thanks. -- Jeff J. Eric Blake wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > >>Cygwin popen does not match Linux popen when stdout is closed. > > ... > >>Oops - when stdout is closed, and the pipe is output on child, cygwin >>popen mistakenly lost the pipe in both processes. >> >> >>The real world case that found this: >>cygwin$ echo 'errprint(esyscmd(echo hi))dnl' | m4 >&- >>sh: line 0: echo: write error: Bad file descriptor >> >>linux$ echo 'errprint(esyscmd(echo hi))dnl' | m4 >&- >>hi > > > Fixed as follows, along with a fix to obey POSIX "The popen() function > shall ensure that any streams from previous popen() calls that remain open > in the parent process are closed in the new child process." > > 2006-08-22 Eric Blake > > * libc/posix/popen.c (popen): Don't close output end of pipe in > child if stdout was closed on entry. > [HAVE_FCNTL]: In parent, mark file as close-on-exec, per POSIX. > > - -- > Life is short - so eat dessert first! > > Eric Blake ebb9 AT byu DOT net > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.2.1 (Cygwin) > Comment: Public key at home.comcast.net/~ericblake/eblake.gpg > Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org > > iD8DBQFE61fw84KuGfSFAYARArN1AJ0ePKBbffbvvJaJOyW2XlsXUBFixwCffAvM > xu28ESQ/Md1uD58Bh77N+V4= > =oy2k > -----END PGP SIGNATURE----- > > > ------------------------------------------------------------------------ > > Index: libc/posix/popen.c > =================================================================== > RCS file: /cvs/src/src/newlib/libc/posix/popen.c,v > retrieving revision 1.5 > diff -u -p -r1.5 popen.c > --- libc/posix/popen.c 6 Jun 2003 19:57:51 -0000 1.5 > +++ libc/posix/popen.c 22 Aug 2006 19:13:23 -0000 > @@ -1,7 +1,7 @@ > /* $NetBSD: popen.c,v 1.11 1995/06/16 07:05:33 jtc Exp $ */ > > /* > - * Copyright (c) 1988, 1993 > + * Copyright (c) 1988, 1993, 2006 > * The Regents of the University of California. All rights reserved. > * > * This code is derived from software written by Ken Arnold and > @@ -55,6 +55,7 @@ static char rcsid[] = "$NetBSD: popen.c, > #include > #include > #include > +#include > > static struct pid { > struct pid *next; > @@ -102,7 +103,9 @@ _DEFUN(popen, (program, type), > (void)dup2(pdes[1], STDOUT_FILENO); > (void)close(pdes[1]); > } > - (void) close(pdes[0]); > + if (pdes[0] != STDOUT_FILENO) { > + (void) close(pdes[0]); > + } > } else { > if (pdes[0] != STDIN_FILENO) { > (void)dup2(pdes[0], STDIN_FILENO); > @@ -129,6 +132,12 @@ _DEFUN(popen, (program, type), > (void)close(pdes[0]); > } > > +#ifdef HAVE_FCNTL > + /* Hide pipe from future popens; assume fcntl can't fail. */ > + fcntl (fileno (iop), F_SETFD, > + fcntl (fileno (iop), F_GETFD, 0) | FD_CLOEXEC); > +#endif /* HAVE_FCNTL */ > + > /* Link into list of file descriptors. */ > cur->fp = iop; > cur->pid = pid; -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/