From ba2db53097a7f6c97d0cb67761459ffd9ceffe85 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Mon, 24 Mar 2014 16:46:08 +0100 Subject: librpc: split type specific VT checks into helpers Signed-off-by: David Disseldorp Reviewed-by: Jeremy Allison --- librpc/rpc/dcerpc_util.c | 83 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 26 deletions(-) (limited to 'librpc/rpc') diff --git a/librpc/rpc/dcerpc_util.c b/librpc/rpc/dcerpc_util.c index b5810ee0b74..6efba7d3ba7 100644 --- a/librpc/rpc/dcerpc_util.c +++ b/librpc/rpc/dcerpc_util.c @@ -534,6 +534,53 @@ do { \ } while(0) +static bool dcerpc_sec_vt_bitmask_check(const uint32_t *bitmask1, + struct dcerpc_sec_vt *c) +{ + if (bitmask1 == NULL) { + CHECK("Bitmask1 must_process_command", + !(c->command & DCERPC_SEC_VT_MUST_PROCESS)); + return true; + } + + if (c->u.bitmask1 & DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING) { + CHECK("Bitmask1 client_header_signing", + *bitmask1 & DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING); + } + return true; +} + +static bool dcerpc_sec_vt_pctx_check(const struct dcerpc_sec_vt_pcontext *pcontext, + struct dcerpc_sec_vt *c) +{ + if (pcontext == NULL) { + CHECK("Pcontext must_process_command", + !(c->command & DCERPC_SEC_VT_MUST_PROCESS)); + return true; + } + + CHECK_SYNTAX("Pcontect abstract_syntax", + pcontext->abstract_syntax, + c->u.pcontext.abstract_syntax); + CHECK_SYNTAX("Pcontext transfer_syntax", + pcontext->transfer_syntax, + c->u.pcontext.transfer_syntax); + return true; +} + +static bool dcerpc_sec_vt_hdr2_check(const struct dcerpc_sec_vt_header2 *header2, + struct dcerpc_sec_vt *c) +{ + if (header2 == NULL) { + CHECK("Header2 must_process_command", + !(c->command & DCERPC_SEC_VT_MUST_PROCESS)); + return true; + } + + CHECK("Header2", dcerpc_sec_vt_header2_equal(header2, &c->u.header2)); + return true; +} + bool dcerpc_sec_verification_trailer_check( const struct dcerpc_sec_verification_trailer *vt, const uint32_t *bitmask1, @@ -547,45 +594,29 @@ bool dcerpc_sec_verification_trailer_check( } for (i=0; i < vt->count.count; i++) { + bool ok; struct dcerpc_sec_vt *c = &vt->commands[i]; switch (c->command & DCERPC_SEC_VT_COMMAND_ENUM) { case DCERPC_SEC_VT_COMMAND_BITMASK1: - if (bitmask1 == NULL) { - CHECK("Bitmask1 must_process_command", - !(c->command & DCERPC_SEC_VT_MUST_PROCESS)); - break; - } - - if (c->u.bitmask1 & DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING) { - CHECK("Bitmask1 client_header_signing", - *bitmask1 & DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING); + ok = dcerpc_sec_vt_bitmask_check(bitmask1, c); + if (!ok) { + return false; } break; case DCERPC_SEC_VT_COMMAND_PCONTEXT: - if (pcontext == NULL) { - CHECK("Pcontext must_process_command", - !(c->command & DCERPC_SEC_VT_MUST_PROCESS)); - break; + ok = dcerpc_sec_vt_pctx_check(pcontext, c); + if (!ok) { + return false; } - - CHECK_SYNTAX("Pcontect abstract_syntax", - pcontext->abstract_syntax, - c->u.pcontext.abstract_syntax); - CHECK_SYNTAX("Pcontext transfer_syntax", - pcontext->transfer_syntax, - c->u.pcontext.transfer_syntax); break; case DCERPC_SEC_VT_COMMAND_HEADER2: { - if (header2 == NULL) { - CHECK("Header2 must_process_command", - !(c->command & DCERPC_SEC_VT_MUST_PROCESS)); - break; + ok = dcerpc_sec_vt_hdr2_check(header2, c); + if (!ok) { + return false; } - - CHECK("Header2", dcerpc_sec_vt_header2_equal(header2, &c->u.header2)); break; } -- cgit v1.2.1