]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: Refactor smbd_smb2_request_process_negprot
authorJeremy Allison <jra@samba.org>
Tue, 31 Mar 2015 23:15:59 +0000 (16:15 -0700)
committerKarolin Seeger <kseeger@samba.org>
Wed, 8 Apr 2015 19:34:26 +0000 (21:34 +0200)
Breakout smb2_protocol_dialect_match to support future work in
fsctl_validate_neg_info.

Back port of 6221937acac7017dee397d1c9846236d9fd5f613
written by Ira Cooper <ira@samba.org> and signed off
by Stefan Metzmacher <metze@samba.org>

Fixes bug #11187 - Mac OS X 10.10.x fails Validate Negotiate Request to 4.1.x

https://bugzilla.samba.org/show_bug.cgi?id=11187

Signed-off-by: Jeremy Allison <jra@samba.org>
source3/smbd/globals.h
source3/smbd/smb2_negprot.c

index 1286ced231194e1cfdf769559e00932281e7ee74..0942e46744dcf69c41397ed599bac2a8205b7d06 100644 (file)
@@ -258,6 +258,9 @@ NTSTATUS smbd_smb2_request_verify_creditcharge(struct smbd_smb2_request *req,
 NTSTATUS smbd_smb2_request_verify_sizes(struct smbd_smb2_request *req,
                                        size_t expected_body_size);
 
+enum protocol_types smbd_smb2_protocol_dialect_match(const uint8_t *indyn,
+                                       const int dialect_count,
+                                       uint16_t *dialect);
 NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req);
 NTSTATUS smbd_smb2_request_process_sesssetup(struct smbd_smb2_request *req);
 NTSTATUS smbd_smb2_request_process_logoff(struct smbd_smb2_request *req);
index 963a5572532491461a65e34044d950fe5043f47f..0cf5c8d697a4fb99001d2f11e538e2f4aac2502a 100644 (file)
@@ -82,6 +82,43 @@ void reply_smb20ff(struct smb_request *req, uint16_t choice)
        reply_smb20xx(req, SMB2_DIALECT_REVISION_2FF);
 }
 
+enum protocol_types smbd_smb2_protocol_dialect_match(const uint8_t *indyn,
+                               const int dialect_count,
+                               uint16_t *dialect)
+{
+       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_srv_maxprotocol() < pd[i].proto) {
+                       continue;
+               }
+               if (lp_srv_minprotocol() > pd[i].proto) {
+                       continue;
+               }
+
+               for (c = 0; c < dialect_count; c++) {
+                       *dialect = SVAL(indyn, c*2);
+                       if (*dialect == pd[i].dialect) {
+                               return pd[i].proto;
+                       }
+               }
+       }
+
+       return PROTOCOL_NONE;
+}
+
 NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
 {
        NTSTATUS status;
@@ -138,80 +175,9 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
        }
        indyn = SMBD_SMB2_IN_DYN_PTR(req);
 
-       for (c=0; protocol == PROTOCOL_NONE && c < dialect_count; c++) {
-               if (lp_srv_maxprotocol() < PROTOCOL_SMB3_00) {
-                       break;
-               }
-               if (lp_srv_minprotocol() > 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_srv_maxprotocol() < PROTOCOL_SMB2_24) {
-                       break;
-               }
-               if (lp_srv_minprotocol() > 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_srv_maxprotocol() < PROTOCOL_SMB2_22) {
-                       break;
-               }
-               if (lp_srv_minprotocol() > 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_srv_maxprotocol() < PROTOCOL_SMB2_10) {
-                       break;
-               }
-               if (lp_srv_minprotocol() > PROTOCOL_SMB2_10) {
-                       break;
-               }
-
-               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_srv_maxprotocol() < PROTOCOL_SMB2_02) {
-                       break;
-               }
-               if (lp_srv_minprotocol() > PROTOCOL_SMB2_02) {
-                       break;
-               }
-
-               dialect = SVAL(indyn, c*2);
-               if (dialect == SMB2_DIALECT_REVISION_202) {
-                       protocol = PROTOCOL_SMB2_02;
-                       break;
-               }
-       }
+       protocol = smbd_smb2_protocol_dialect_match(indyn,
+                                       dialect_count,
+                                       &dialect);
 
        for (c=0; protocol == PROTOCOL_NONE && c < dialect_count; c++) {
                if (lp_srv_maxprotocol() < PROTOCOL_SMB2_10) {