Module: wine Branch: master Commit: 171dab0696bcb390e8bd4cd00d8b4160134f2e93 URL: https://source.winehq.org/git/wine.git/?a=commit;h=171dab0696bcb390e8bd4cd00...
Author: Alexandre Julliard julliard@winehq.org Date: Tue May 7 15:03:29 2019 -0500
kernel32: Reset stdio file descriptors when passed invalid handles.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/process.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index 09ab077..200ea8b 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -2029,6 +2029,27 @@ static BOOL terminate_main_thread(void) } #endif
+ +/*********************************************************************** + * set_stdio_fd + */ +static void set_stdio_fd( int stdin_fd, int stdout_fd ) +{ + int fd = -1; + + if (stdin_fd == -1 || stdout_fd == -1) + { + fd = open( "/dev/null", O_RDWR ); + if (stdin_fd == -1) stdin_fd = fd; + if (stdout_fd == -1) stdout_fd = fd; + } + + dup2( stdin_fd, 0 ); + dup2( stdout_fd, 1 ); + if (fd != -1) close( fd ); +} + + /*********************************************************************** * spawn_loader */ @@ -2060,21 +2081,10 @@ static pid_t spawn_loader( const RTL_USER_PROCESS_PARAMETERS *params, int socket if (params->ConsoleFlags || params->ConsoleHandle == KERNEL32_CONSOLE_ALLOC || (params->hStdInput == INVALID_HANDLE_VALUE && params->hStdOutput == INVALID_HANDLE_VALUE)) { - int fd = open( "/dev/null", O_RDWR ); setsid(); - /* close stdin and stdout */ - if (fd != -1) - { - dup2( fd, 0 ); - dup2( fd, 1 ); - close( fd ); - } - } - else - { - if (stdin_fd != -1) dup2( stdin_fd, 0 ); - if (stdout_fd != -1) dup2( stdout_fd, 1 ); + set_stdio_fd( -1, -1 ); /* close stdin and stdout */ } + else set_stdio_fd( stdin_fd, stdout_fd );
if (stdin_fd != -1) close( stdin_fd ); if (stdout_fd != -1) close( stdout_fd );