Rob Shearman : rpcrt4:
Close the connection if a protocol error or certain other kinds of
errors occur , instead of returning it to the connection pool.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jun 26 07:11:46 CDT 2007
Module: wine
Branch: master
Commit: c411d95e204abd8dedd1415894a8343fb3b16cd4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c411d95e204abd8dedd1415894a8343fb3b16cd4
Author: Rob Shearman <rob at codeweavers.com>
Date: Mon Jun 25 14:23:45 2007 +0100
rpcrt4: Close the connection if a protocol error or certain other kinds of errors occur, instead of returning it to the connection pool.
---
dlls/rpcrt4/rpc_message.c | 40 +++++++++++++++++++++++++++++++++-------
1 files changed, 33 insertions(+), 7 deletions(-)
diff --git a/dlls/rpcrt4/rpc_message.c b/dlls/rpcrt4/rpc_message.c
index dd37f33..cd25520 100644
--- a/dlls/rpcrt4/rpc_message.c
+++ b/dlls/rpcrt4/rpc_message.c
@@ -952,6 +952,23 @@ RPC_STATUS WINAPI I_RpcSend(PRPC_MESSAGE pMsg)
return status;
}
+/* is this status something that the server can't recover from? */
+static inline BOOL is_hard_error(RPC_STATUS status)
+{
+ switch (status)
+ {
+ case 0: /* user-defined fault */
+ case ERROR_ACCESS_DENIED:
+ case ERROR_INVALID_PARAMETER:
+ case RPC_S_PROTOCOL_ERROR:
+ case RPC_S_CALL_FAILED:
+ case RPC_S_CALL_FAILED_DNE:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
/***********************************************************************
* I_RpcReceive [RPCRT4.@]
*/
@@ -999,31 +1016,40 @@ RPC_STATUS WINAPI I_RpcReceive(PRPC_MESSAGE pMsg)
goto fail;
}
- status = RPC_S_PROTOCOL_ERROR;
-
switch (hdr->common.ptype) {
case PKT_RESPONSE:
- if (bind->server) goto fail;
+ if (bind->server) {
+ status = RPC_S_PROTOCOL_ERROR;
+ goto fail;
+ }
break;
case PKT_REQUEST:
- if (!bind->server) goto fail;
+ if (!bind->server) {
+ status = RPC_S_PROTOCOL_ERROR;
+ goto fail;
+ }
break;
case PKT_FAULT:
pMsg->RpcFlags |= WINE_RPCFLAG_EXCEPTION;
ERR ("we got fault packet with status 0x%lx\n", hdr->fault.status);
status = hdr->fault.status; /* FIXME: do translation from nca error codes */
- goto fail;
+ if (is_hard_error(status))
+ goto fail;
+ break;
default:
WARN("bad packet type %d\n", hdr->common.ptype);
+ status = RPC_S_PROTOCOL_ERROR;
goto fail;
}
/* success */
- status = RPC_S_OK;
+ RPCRT4_CloseBinding(bind, conn);
+ RPCRT4_FreeHeader(hdr);
+ return status;
fail:
RPCRT4_FreeHeader(hdr);
- RPCRT4_CloseBinding(bind, conn);
+ RPCRT4_DestroyConnection(conn);
return status;
}
More information about the wine-cvs
mailing list