Module: wine Branch: master Commit: 6bb26abe8181693272be13408273132d54a81712 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6bb26abe8181693272be134082...
Author: Rob Shearman robertshearman@gmail.com Date: Wed Jun 18 17:32:22 2008 +0100
rpcrt4: Make RpcAssoc_BindConnection use RPCRT4_ReceiveWithAuth instead of RPCRT4_Receive.
Move the special handling of the PKT_BIND_ACK packet from RPCRT4_ReceiveWithAuth to RpcAssoc_BindConnection, where it belongs.
---
dlls/rpcrt4/rpc_assoc.c | 21 ++++++++++++++++----- dlls/rpcrt4/rpc_message.c | 14 ++------------ dlls/rpcrt4/rpc_message.h | 1 + 3 files changed, 19 insertions(+), 17 deletions(-)
diff --git a/dlls/rpcrt4/rpc_assoc.c b/dlls/rpcrt4/rpc_assoc.c index 6075278..e8f3676 100644 --- a/dlls/rpcrt4/rpc_assoc.c +++ b/dlls/rpcrt4/rpc_assoc.c @@ -222,6 +222,8 @@ static RPC_STATUS RpcAssoc_BindConnection(const RpcAssoc *assoc, RpcConnection * RpcPktHdr *response_hdr; RPC_MESSAGE msg; RPC_STATUS status; + unsigned char *auth_data = NULL; + unsigned long auth_length;
TRACE("sending bind request to server\n");
@@ -235,10 +237,10 @@ static RPC_STATUS RpcAssoc_BindConnection(const RpcAssoc *assoc, RpcConnection * if (status != RPC_S_OK) return status;
- status = RPCRT4_Receive(conn, &response_hdr, &msg); + status = RPCRT4_ReceiveWithAuth(conn, &response_hdr, &msg, &auth_data, &auth_length); if (status != RPC_S_OK) { - ERR("receive failed\n"); + ERR("receive failed with error %ld\n", status); return status; }
@@ -259,9 +261,17 @@ static RPC_STATUS RpcAssoc_BindConnection(const RpcAssoc *assoc, RpcConnection * switch (results->results[0].result) { case RESULT_ACCEPT: - conn->assoc_group_id = response_hdr->bind_ack.assoc_gid; - conn->MaxTransmissionSize = response_hdr->bind_ack.max_tsize; - conn->ActiveInterface = *InterfaceId; + /* respond to authorization request */ + if (auth_length > sizeof(RpcAuthVerifier)) + status = RPCRT4_AuthorizeConnection(conn, + auth_data + sizeof(RpcAuthVerifier), + auth_length); + if (status == RPC_S_OK) + { + conn->assoc_group_id = response_hdr->bind_ack.assoc_gid; + conn->MaxTransmissionSize = response_hdr->bind_ack.max_tsize; + conn->ActiveInterface = *InterfaceId; + } break; case RESULT_PROVIDER_REJECTION: switch (results->results[0].reason) @@ -334,6 +344,7 @@ static RPC_STATUS RpcAssoc_BindConnection(const RpcAssoc *assoc, RpcConnection *
I_RpcFree(msg.Buffer); RPCRT4_FreeHeader(response_hdr); + HeapFree(GetProcessHeap(), 0, auth_data); return status; }
diff --git a/dlls/rpcrt4/rpc_message.c b/dlls/rpcrt4/rpc_message.c index fc89e2a..48c7df0 100644 --- a/dlls/rpcrt4/rpc_message.c +++ b/dlls/rpcrt4/rpc_message.c @@ -631,8 +631,8 @@ failed: /*********************************************************************** * RPCRT4_AuthorizeBinding (internal) */ -static RPC_STATUS RPCRT_AuthorizeConnection(RpcConnection* conn, - BYTE *challenge, ULONG count) +RPC_STATUS RPCRT4_AuthorizeConnection(RpcConnection* conn, BYTE *challenge, + ULONG count) { SecBuffer inp, out; RpcPktHdr *resp_hdr; @@ -948,16 +948,6 @@ RPC_STATUS RPCRT4_ReceiveWithAuth(RpcConnection *Connection, RpcPktHdr **Header, } pMsg->BufferLength = buffer_length;
- /* respond to authorization request */ - if ((*Header)->common.ptype == PKT_BIND_ACK && auth_length > sizeof(RpcAuthVerifier)) - { - status = RPCRT_AuthorizeConnection(Connection, - auth_data + sizeof(RpcAuthVerifier), - auth_length); - if (status) - goto fail; - } - /* success */ status = RPC_S_OK;
diff --git a/dlls/rpcrt4/rpc_message.h b/dlls/rpcrt4/rpc_message.h index a9378fa..95eb807 100644 --- a/dlls/rpcrt4/rpc_message.h +++ b/dlls/rpcrt4/rpc_message.h @@ -37,5 +37,6 @@ RPC_STATUS RPCRT4_Receive(RpcConnection *Connection, RpcPktHdr **Header, PRPC_ME RPC_STATUS RPCRT4_ReceiveWithAuth(RpcConnection *Connection, RpcPktHdr **Header, PRPC_MESSAGE pMsg, unsigned char **auth_data_out, unsigned long *auth_length_out); NCA_STATUS RPC2NCA_STATUS(RPC_STATUS status); RPC_STATUS NCA2RPC_STATUS(NCA_STATUS status); +RPC_STATUS RPCRT4_AuthorizeConnection(RpcConnection* conn, BYTE *challenge, ULONG count);
#endif