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