From fc60086d88c7f4d74f7583289bd36d2512fa4847 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 26 Sep 2014 06:31:58 +0200 Subject: [PATCH 1/3] smbd:smb2: improve smbd_smb2_protocol_dialect_match(), removing code duplication Signed-off-by: Michael Adam --- source3/smbd/smb2_negprot.c | 98 ++++++++++++--------------------------------- 1 file changed, 25 insertions(+), 73 deletions(-) diff --git a/source3/smbd/smb2_negprot.c b/source3/smbd/smb2_negprot.c index 6524658..d40a17f 100644 --- a/source3/smbd/smb2_negprot.c +++ b/source3/smbd/smb2_negprot.c @@ -87,85 +87,37 @@ enum protocol_types smbd_smb2_protocol_dialect_match(const uint8_t *indyn, const int dialect_count, uint16_t *dialect) { - size_t c = 0; - enum protocol_types protocol = PROTOCOL_NONE; - - for (c=0; protocol == PROTOCOL_NONE && c < dialect_count; c++) { - if (lp_server_max_protocol() < PROTOCOL_SMB3_00) { - break; - } - if (lp_server_min_protocol() > PROTOCOL_SMB3_00) { - break; - } - - *dialect = SVAL(indyn, c*2); - if (*dialect == SMB3_DIALECT_REVISION_300) { - protocol = PROTOCOL_SMB3_00; - break; - } - } - - for (c=0; protocol == PROTOCOL_NONE && c < dialect_count; c++) { - if (lp_server_max_protocol() < PROTOCOL_SMB2_24) { - break; - } - if (lp_server_min_protocol() > PROTOCOL_SMB2_24) { - break; - } - - *dialect = SVAL(indyn, c*2); - if (*dialect == SMB2_DIALECT_REVISION_224) { - protocol = PROTOCOL_SMB2_24; - break; - } - } - - for (c=0; protocol == PROTOCOL_NONE && c < dialect_count; c++) { - if (lp_server_max_protocol() < PROTOCOL_SMB2_22) { - break; + struct { + enum protocol_types proto; + uint16_t dialect; + } pd[] = { + { PROTOCOL_SMB3_00, SMB3_DIALECT_REVISION_300 }, + { PROTOCOL_SMB2_24, SMB2_DIALECT_REVISION_224 }, + { PROTOCOL_SMB2_22, SMB2_DIALECT_REVISION_222 }, + { PROTOCOL_SMB2_10, SMB2_DIALECT_REVISION_210 }, + { PROTOCOL_SMB2_02, SMB2_DIALECT_REVISION_202 }, + }; + size_t i; + + for (i = 0; i < ARRAY_SIZE(pd); i ++) { + size_t c = 0; + + if (lp_server_max_protocol() < pd[i].proto) { + continue; } - if (lp_server_min_protocol() > PROTOCOL_SMB2_22) { - break; - } - - *dialect = SVAL(indyn, c*2); - if (*dialect == SMB2_DIALECT_REVISION_222) { - protocol = PROTOCOL_SMB2_22; - break; - } - } - - for (c=0; protocol == PROTOCOL_NONE && c < dialect_count; c++) { - if (lp_server_max_protocol() < PROTOCOL_SMB2_10) { - break; - } - if (lp_server_min_protocol() > PROTOCOL_SMB2_10) { - break; + if (lp_server_min_protocol() > pd[i].proto) { + continue; } - *dialect = SVAL(indyn, c*2); - if (*dialect == SMB2_DIALECT_REVISION_210) { - protocol = PROTOCOL_SMB2_10; - break; - } - } - - for (c=0; protocol == PROTOCOL_NONE && c < dialect_count; c++) { - if (lp_server_max_protocol() < PROTOCOL_SMB2_02) { - break; - } - if (lp_server_min_protocol() > PROTOCOL_SMB2_02) { - break; - } - - *dialect = SVAL(indyn, c*2); - if (*dialect == SMB2_DIALECT_REVISION_202) { - protocol = PROTOCOL_SMB2_02; - break; + for (c = 0; c < dialect_count; c++) { + *dialect = SVAL(indyn, c*2); + if (*dialect == pd[i].dialect) { + return pd[i].proto; + } } } - return protocol; + return PROTOCOL_NONE; } NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req) -- 1.9.1