Alexandre Julliard : kernel32: Reset stdio file descriptors when passed invalid handles.
Alexandre Julliard
julliard at winehq.org
Tue May 7 17:32:47 CDT 2019
Module: wine
Branch: master
Commit: 171dab0696bcb390e8bd4cd00d8b4160134f2e93
URL: https://source.winehq.org/git/wine.git/?a=commit;h=171dab0696bcb390e8bd4cd00d8b4160134f2e93
Author: Alexandre Julliard <julliard at 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 at 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 );
More information about the wine-cvs
mailing list