From d8d7feefa738eb3138790c99aa891ef44d85e4cc Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 19 Jul 2007 17:02:07 +0000 Subject: (_IO_new_proc_open): Don't close child_std_end if one of proc_file_chain streams has that fileno. --- libio/iopopen.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/libio/iopopen.c b/libio/iopopen.c index 896e930f40..d5c6305b09 100644 --- a/libio/iopopen.c +++ b/libio/iopopen.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1993, 1997-2002, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1997-2002, 2003, 2004, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Per Bothner . @@ -169,7 +170,15 @@ _IO_new_proc_open (fp, command, mode) popen() calls that remain open in the parent process are closed in the new child process." */ for (p = proc_file_chain; p; p = p->next) - _IO_close (_IO_fileno ((_IO_FILE *) p)); + { + int fd = _IO_fileno ((_IO_FILE *) p); + + /* If any stream from previous popen() calls has fileno + child_std_end, it has been already closed by the dup2 syscall + above. */ + if (fd != child_std_end) + _IO_close (fd); + } _IO_execl ("/bin/sh", "sh", "-c", command, (char *) 0); _IO__exit (127); -- cgit 1.4.1