Alexandre Julliard : msvcrt: Don't try to duplicate invalid handles. Don' t reset std handles if we didn't set them.

Alexandre Julliard julliard at winehq.org
Wed Feb 18 10:15:36 CST 2009


Module: wine
Branch: master
Commit: 1c91d54503f9b2afa513dc4dd79bf19bc9bad51a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1c91d54503f9b2afa513dc4dd79bf19bc9bad51a

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Feb 18 14:44:17 2009 +0100

msvcrt: Don't try to duplicate invalid handles. Don't reset std handles if we didn't set them.

---

 dlls/msvcrt/file.c |   42 +++++++++++++++++++++++++++---------------
 1 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 6082cb9..7e1210c 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -168,7 +168,10 @@ static HANDLE msvcrt_fdtoh(int fd)
 /* INTERNAL: free a file entry fd */
 static void msvcrt_free_fd(int fd)
 {
+  HANDLE old_handle;
+
   LOCK_FILES();
+  old_handle = MSVCRT_fdesc[fd].handle;
   MSVCRT_fdesc[fd].handle = INVALID_HANDLE_VALUE;
   MSVCRT_fdesc[fd].wxflag = 0;
   TRACE(":fd (%d) freed\n",fd);
@@ -176,9 +179,15 @@ static void msvcrt_free_fd(int fd)
   {
     switch (fd)
     {
-    case 0: SetStdHandle(STD_INPUT_HANDLE,  NULL); break;
-    case 1: SetStdHandle(STD_OUTPUT_HANDLE, NULL); break;
-    case 2: SetStdHandle(STD_ERROR_HANDLE,  NULL); break;
+    case 0:
+        if (GetStdHandle(STD_INPUT_HANDLE) == old_handle) SetStdHandle(STD_INPUT_HANDLE, 0);
+        break;
+    case 1:
+        if (GetStdHandle(STD_OUTPUT_HANDLE) == old_handle) SetStdHandle(STD_OUTPUT_HANDLE, 0);
+        break;
+    case 2:
+        if (GetStdHandle(STD_ERROR_HANDLE) == old_handle) SetStdHandle(STD_ERROR_HANDLE, 0);
+        break;
     }
   }
   else
@@ -361,24 +370,27 @@ void msvcrt_init_io(void)
 
   if (!(MSVCRT_fdesc[0].wxflag & WX_OPEN) || MSVCRT_fdesc[0].handle == INVALID_HANDLE_VALUE)
   {
-    DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_INPUT_HANDLE),
-                    GetCurrentProcess(), &MSVCRT_fdesc[0].handle, 0, TRUE, 
-                    DUPLICATE_SAME_ACCESS);
-    MSVCRT_fdesc[0].wxflag = WX_OPEN | WX_TEXT;
+      HANDLE std = GetStdHandle(STD_INPUT_HANDLE);
+      if (std != INVALID_HANDLE_VALUE && DuplicateHandle(GetCurrentProcess(), std,
+                                                         GetCurrentProcess(), &MSVCRT_fdesc[0].handle,
+                                                         0, TRUE, DUPLICATE_SAME_ACCESS))
+          MSVCRT_fdesc[0].wxflag = WX_OPEN | WX_TEXT;
   }
   if (!(MSVCRT_fdesc[1].wxflag & WX_OPEN) || MSVCRT_fdesc[1].handle == INVALID_HANDLE_VALUE)
   {
-    DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_OUTPUT_HANDLE),
-                    GetCurrentProcess(), &MSVCRT_fdesc[1].handle, 0, TRUE, 
-                    DUPLICATE_SAME_ACCESS);
-    MSVCRT_fdesc[1].wxflag = WX_OPEN | WX_TEXT;
+      HANDLE std = GetStdHandle(STD_OUTPUT_HANDLE);
+      if (std != INVALID_HANDLE_VALUE && DuplicateHandle(GetCurrentProcess(), std,
+                                                         GetCurrentProcess(), &MSVCRT_fdesc[1].handle,
+                                                         0, TRUE, DUPLICATE_SAME_ACCESS))
+          MSVCRT_fdesc[1].wxflag = WX_OPEN | WX_TEXT;
   }
   if (!(MSVCRT_fdesc[2].wxflag & WX_OPEN) || MSVCRT_fdesc[2].handle == INVALID_HANDLE_VALUE)
   {
-    DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_ERROR_HANDLE),
-                    GetCurrentProcess(), &MSVCRT_fdesc[2].handle, 0, TRUE, 
-                    DUPLICATE_SAME_ACCESS);
-    MSVCRT_fdesc[2].wxflag = WX_OPEN | WX_TEXT;
+      HANDLE std = GetStdHandle(STD_ERROR_HANDLE);
+      if (std != INVALID_HANDLE_VALUE && DuplicateHandle(GetCurrentProcess(), std,
+                                                         GetCurrentProcess(), &MSVCRT_fdesc[2].handle,
+                                                         0, TRUE, DUPLICATE_SAME_ACCESS))
+          MSVCRT_fdesc[2].wxflag = WX_OPEN | WX_TEXT;
   }
 
   TRACE(":handles (%p)(%p)(%p)\n",MSVCRT_fdesc[0].handle,




More information about the wine-cvs mailing list