Alexandre Julliard : rpcrt4: Properly handle the case of a client having disconnected in rpcrt4_conn_listen_pipe .

Alexandre Julliard julliard at winehq.org
Mon Jun 9 07:13:02 CDT 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jun  9 12:56:42 2008 +0200

rpcrt4: Properly handle the case of a client having disconnected in rpcrt4_conn_listen_pipe.

---

 dlls/rpcrt4/rpc_transport.c |   35 ++++++++++++++++++++++-------------
 1 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/dlls/rpcrt4/rpc_transport.c b/dlls/rpcrt4/rpc_transport.c
index 8bca0fe..86c4e4f 100644
--- a/dlls/rpcrt4/rpc_transport.c
+++ b/dlls/rpcrt4/rpc_transport.c
@@ -118,20 +118,29 @@ static RPC_STATUS rpcrt4_conn_listen_pipe(RpcConnection_np *npc)
     return RPC_S_OK;
 
   npc->listening = TRUE;
-  if (ConnectNamedPipe(npc->pipe, &npc->ovl))
-    return RPC_S_OK;
+  for (;;)
+  {
+      if (ConnectNamedPipe(npc->pipe, &npc->ovl))
+          return RPC_S_OK;
 
-  if (GetLastError() == ERROR_PIPE_CONNECTED) {
-    SetEvent(npc->ovl.hEvent);
-    return RPC_S_OK;
-  }
-  if (GetLastError() == ERROR_IO_PENDING) {
-    /* will be completed in rpcrt4_protseq_np_wait_for_new_connection */
-    return RPC_S_OK;
+      switch(GetLastError())
+      {
+      case ERROR_PIPE_CONNECTED:
+          SetEvent(npc->ovl.hEvent);
+          return RPC_S_OK;
+      case ERROR_IO_PENDING:
+          /* will be completed in rpcrt4_protseq_np_wait_for_new_connection */
+          return RPC_S_OK;
+      case ERROR_NO_DATA_DETECTED:
+          /* client has disconnected, retry */
+          DisconnectNamedPipe( npc->pipe );
+          break;
+      default:
+          npc->listening = FALSE;
+          WARN("Couldn't ConnectNamedPipe (error was %d)\n", GetLastError());
+          return RPC_S_OUT_OF_RESOURCES;
+      }
   }
-  npc->listening = FALSE;
-  WARN("Couldn't ConnectNamedPipe (error was %d)\n", GetLastError());
-  return RPC_S_OUT_OF_RESOURCES;
 }
 
 static RPC_STATUS rpcrt4_conn_create_pipe(RpcConnection *Connection, LPCSTR pname)




More information about the wine-cvs mailing list