Alexandre Julliard : ole32: Fix a couple of race conditions with the local server pipe.

Alexandre Julliard julliard at winehq.org
Mon Aug 1 13:22:11 CDT 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Aug  1 16:20:40 2011 +0200

ole32: Fix a couple of race conditions with the local server pipe.

---

 dlls/ole32/rpc.c |   44 ++++++++++++++++++++++++--------------------
 1 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/dlls/ole32/rpc.c b/dlls/ole32/rpc.c
index 1a0b575..8ac5d2d 100644
--- a/dlls/ole32/rpc.c
+++ b/dlls/ole32/rpc.c
@@ -1890,7 +1890,7 @@ static DWORD WINAPI local_server_thread(LPVOID param)
     ULONG		res;
     BOOL multi_use = lsp->multi_use;
     OVERLAPPED ovl;
-    HANDLE pipe_event;
+    HANDLE pipe_event, hPipe, new_pipe;
     DWORD  bytes;
 
     TRACE("Starting threader for %s.\n",debugstr_guid(&lsp->clsid));
@@ -1899,22 +1899,19 @@ static DWORD WINAPI local_server_thread(LPVOID param)
     get_localserver_pipe_name(pipefn, &lsp->clsid);
     ovl.hEvent = pipe_event = CreateEventW(NULL, FALSE, FALSE, NULL);
 
+    hPipe = CreateNamedPipeW( pipefn, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
+                              PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES,
+                              4096, 4096, 500 /* 0.5 second timeout */, NULL );
+    if (hPipe == INVALID_HANDLE_VALUE)
+    {
+        FIXME("pipe creation failed for %s, le is %u\n", debugstr_w(pipefn), GetLastError());
+        CloseHandle(pipe_event);
+        return 1;
+    }
+
     SetEvent(lsp->ready_event);
-    /* Clients trying to connect between now and CreateNamedPipeW() will
-     * fail and will have to retry. See also the end of the loop.
-     */
-    while (1) {
-        HANDLE hPipe;
-        hPipe = CreateNamedPipeW( pipefn, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
-                                  PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES,
-                                  4096, 4096, 500 /* 0.5 second timeout */, NULL );
-        if (hPipe == INVALID_HANDLE_VALUE)
-        {
-            FIXME("pipe creation failed for %s, le is %u\n", debugstr_w(pipefn), GetLastError());
-            CloseHandle(pipe_event);
-            return 1;
-        }
 
+    while (1) {
         if (!ConnectNamedPipe(hPipe, &ovl))
         {
             DWORD error = GetLastError();
@@ -1976,18 +1973,25 @@ static DWORD WINAPI local_server_thread(LPVOID param)
 
         FlushFileBuffers(hPipe);
         DisconnectNamedPipe(hPipe);
-        CloseHandle(hPipe);
-        /* Clients trying to connect between now and CreateNamedPipeW() will
-         * fail and will have to retry.
-         */
-
         TRACE("done marshalling IClassFactory\n");
 
         if (!multi_use)
         {
             TRACE("single use object, shutting down pipe %s\n", debugstr_w(pipefn));
+            CloseHandle(hPipe);
             break;
         }
+        new_pipe = CreateNamedPipeW( pipefn, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
+                                     PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES,
+                                     4096, 4096, 500 /* 0.5 second timeout */, NULL );
+        CloseHandle(hPipe);
+        if (new_pipe == INVALID_HANDLE_VALUE)
+        {
+            FIXME("pipe creation failed for %s, le is %u\n", debugstr_w(pipefn), GetLastError());
+            CloseHandle(pipe_event);
+            return 1;
+        }
+        hPipe = new_pipe;
     }
     CloseHandle(pipe_event);
     return 0;




More information about the wine-cvs mailing list