From: jjohnstn Date: Tue, 22 Aug 2006 20:30:37 +0000 (+0000) Subject: 2006-08-22 Eric Blake X-Git-Tag: drop_9x_support_start~1893 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=131df9fa5f7c139ca02ca9026e386b56af17aed0;p=pf3gnuchains%2Fpf3gnuchains4x.git 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. --- diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 9e068c8a3f..231d02d9cc 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,9 @@ +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. + 2006-08-19 Ramana Radhakrishnan * sys/types.h: Correct syntax error caused by missing '\' on #ifdef diff --git a/newlib/libc/posix/popen.c b/newlib/libc/posix/popen.c index 0f25a3ed05..2d3777133f 100644 --- a/newlib/libc/posix/popen.c +++ b/newlib/libc/posix/popen.c @@ -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,v 1.11 1995/06/16 07:05:33 jtc Exp $"; #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;