1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-02 09:47:23 +03:00

s4:rpc_server: convert dcesrv_auth_request() into a generic dcesrv_auth_pkt_pull()

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
This commit is contained in:
Stefan Metzmacher 2015-10-28 13:04:38 +01:00 committed by Andreas Schneider
parent cb94ec8424
commit 2e8c496ef5
2 changed files with 33 additions and 19 deletions

View File

@ -1665,8 +1665,29 @@ static NTSTATUS dcesrv_process_ncacn_packet(struct dcesrv_connection *dce_conn,
DCERPC_NCA_S_PROTO_ERROR);
}
}
}
if (!dcesrv_auth_request(call, &blob)) {
if (call->pkt.ptype == DCERPC_PKT_REQUEST) {
bool ok;
uint8_t payload_offset = DCERPC_REQUEST_LENGTH;
if (call->pkt.pfc_flags & DCERPC_PFC_FLAG_OBJECT_UUID) {
payload_offset += 16;
}
ok = dcesrv_auth_pkt_pull(call, &blob,
0, /* required_flags */
DCERPC_PFC_FLAG_FIRST |
DCERPC_PFC_FLAG_LAST |
DCERPC_PFC_FLAG_PENDING_CANCEL |
0x08 | /* this is not defined, but should be ignored */
DCERPC_PFC_FLAG_CONC_MPX |
DCERPC_PFC_FLAG_DID_NOT_EXECUTE |
DCERPC_PFC_FLAG_MAYBE |
DCERPC_PFC_FLAG_OBJECT_UUID,
payload_offset,
&call->pkt.u.request.stub_and_verifier);
if (!ok) {
/*
* We don't use dcesrv_fault_disconnect()
* here, because we don't want to set

View File

@ -461,9 +461,14 @@ NTSTATUS dcesrv_auth_alter_ack(struct dcesrv_call_state *call, struct ncacn_pack
}
/*
check credentials on a request
check credentials on a packet
*/
bool dcesrv_auth_request(struct dcesrv_call_state *call, DATA_BLOB *full_packet)
bool dcesrv_auth_pkt_pull(struct dcesrv_call_state *call,
DATA_BLOB *full_packet,
uint8_t required_flags,
uint8_t optional_flags,
uint8_t payload_offset,
DATA_BLOB *payload_and_verifier)
{
struct ncacn_packet *pkt = &call->pkt;
struct dcesrv_connection *dce_conn = call->conn;
@ -473,7 +478,6 @@ bool dcesrv_auth_request(struct dcesrv_call_state *call, DATA_BLOB *full_packet)
.auth_context_id = dce_conn->auth_state.auth_context_id,
};
NTSTATUS status;
uint8_t payload_offset = DCERPC_REQUEST_LENGTH;
if (!dce_conn->allow_request) {
call->fault_code = DCERPC_NCA_S_PROTO_ERROR;
@ -484,25 +488,14 @@ bool dcesrv_auth_request(struct dcesrv_call_state *call, DATA_BLOB *full_packet)
return false;
}
if (pkt->pfc_flags & DCERPC_PFC_FLAG_OBJECT_UUID) {
payload_offset += 16;
}
status = dcerpc_ncacn_pull_pkt_auth(&tmp_auth,
dce_conn->auth_state.gensec_security,
call,
DCERPC_PKT_REQUEST,
0, /* required_flags */
DCERPC_PFC_FLAG_FIRST |
DCERPC_PFC_FLAG_LAST |
DCERPC_PFC_FLAG_PENDING_CANCEL |
0x08 | /* this is not defined, but should be ignored */
DCERPC_PFC_FLAG_CONC_MPX |
DCERPC_PFC_FLAG_DID_NOT_EXECUTE |
DCERPC_PFC_FLAG_MAYBE |
DCERPC_PFC_FLAG_OBJECT_UUID,
pkt->ptype,
required_flags,
optional_flags,
payload_offset,
&pkt->u.request.stub_and_verifier,
payload_and_verifier,
full_packet,
pkt);
if (NT_STATUS_EQUAL(status, NT_STATUS_RPC_PROTOCOL_ERROR)) {