Huw Davies : ole32: Don' t return from CoRegisterClassObject until we have created the named pipe.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Sep 28 05:26:50 CDT 2006


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Sep 27 16:23:42 2006 +0100

ole32: Don't return from CoRegisterClassObject until we have created the named pipe.

Also don't fail if the client connects to the pipe between CreateNamedPipe and ConnectNamedPipe.

---

 dlls/ole32/rpc.c |   17 ++++++++++++-----
 1 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/dlls/ole32/rpc.c b/dlls/ole32/rpc.c
index e7266dc..7646e1d 100644
--- a/dlls/ole32/rpc.c
+++ b/dlls/ole32/rpc.c
@@ -924,6 +924,7 @@ struct local_server_params
 {
     CLSID clsid;
     IStream *stream;
+    HANDLE ready_event;
 };
 
 /* FIXME: should call to rpcss instead */
@@ -945,12 +946,14 @@ static DWORD WINAPI local_server_thread(
 
     get_localserver_pipe_name(pipefn, &lsp->clsid);
 
-    HeapFree(GetProcessHeap(), 0, lsp);
-
     hPipe = CreateNamedPipeW( pipefn, PIPE_ACCESS_DUPLEX,
                               PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES,
                               4096, 4096, 500 /* 0.5 second timeout */, NULL );
-    
+
+    SetEvent(lsp->ready_event);
+
+    HeapFree(GetProcessHeap(), 0, lsp);
+
     if (hPipe == INVALID_HANDLE_VALUE)
     {
         FIXME("pipe creation failed for %s, le is %ld\n", debugstr_w(pipefn), GetLastError());
@@ -958,7 +961,7 @@ static DWORD WINAPI local_server_thread(
     }
     
     while (1) {
-        if (!ConnectNamedPipe(hPipe,NULL)) {
+        if (!ConnectNamedPipe(hPipe,NULL) && GetLastError() != ERROR_PIPE_CONNECTED) {
             ERR("Failure during ConnectNamedPipe %ld, ABORT!\n",GetLastError());
             break;
         }
@@ -1002,14 +1005,18 @@ static DWORD WINAPI local_server_thread(
 void RPC_StartLocalServer(REFCLSID clsid, IStream *stream)
 {
     DWORD tid;
-    HANDLE thread;
+    HANDLE thread, ready_event;
     struct local_server_params *lsp = HeapAlloc(GetProcessHeap(), 0, sizeof(*lsp));
 
     lsp->clsid = *clsid;
     lsp->stream = stream;
     IStream_AddRef(stream);
+    lsp->ready_event = ready_event = CreateEventW(NULL, FALSE, FALSE, NULL);
 
     thread = CreateThread(NULL, 0, local_server_thread, lsp, 0, &tid);
     CloseHandle(thread);
     /* FIXME: failure handling */
+
+    WaitForSingleObject(ready_event, INFINITE);
+    CloseHandle(ready_event);
 }




More information about the wine-cvs mailing list