popen bug [patch]

Jeff Johnston jjohnstn@redhat.com
Tue Aug 22 22:42:00 GMT 2006


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  <ebb9@byu.net>
> 
> 	* 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@byu.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 <stdlib.h>
>  #include <string.h>
>  #include <paths.h>
> +#include <fcntl.h>
>  
>  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/



More information about the Cygwin mailing list