From 6bb26abe8181693272be13408273132d54a81712 Mon Sep 17 00:00:00 2001 From: Rob Shearman Date: Wed, 18 Jun 2008 17:32:22 +0100 Subject: [PATCH] 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 6075278c4a4..e8f367659d7 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 fc89e2a37aa..48c7df0d085 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 a9378fa614b..95eb8076ab8 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 -- 2.11.4.GIT