From 887af612190f3c14d6f8513bf405759b98073e01 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 1 Jul 2009 12:13:46 +0200 Subject: [PATCH] kernel32: Avoid the close-on-exec race with pipe() on kernels that support pipe2(). --- dlls/kernel32/process.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index 83d1aa5f68a..6fde35ba079 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -1304,12 +1304,18 @@ static int fork_and_exec( const char *filename, const WCHAR *cmdline, const WCHA if (!env) env = GetEnvironmentStringsW(); - if (pipe(fd) == -1) +#ifdef HAVE_PIPE2 + if (pipe2( fd, O_CLOEXEC ) == -1) +#endif { - SetLastError( ERROR_TOO_MANY_OPEN_FILES ); - return -1; + if (pipe(fd) == -1) + { + SetLastError( ERROR_TOO_MANY_OPEN_FILES ); + return -1; + } + fcntl( fd[0], F_SETFD, FD_CLOEXEC ); + fcntl( fd[1], F_SETFD, FD_CLOEXEC ); } - fcntl( fd[1], F_SETFD, 1 ); /* set close on exec */ if (!(flags & (CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE | DETACHED_PROCESS))) {