From 131df9fa5f7c139ca02ca9026e386b56af17aed0 Mon Sep 17 00:00:00 2001 From: jjohnstn Date: Tue, 22 Aug 2006 20:30:37 +0000 Subject: [PATCH] 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. --- newlib/ChangeLog | 6 ++++++ newlib/libc/posix/popen.c | 13 +++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) 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; -- 2.11.0