Mail Archives: cygwin/2006/08/22/16:35:49
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 AT byu DOT 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 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 <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/
- Raw text -