]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:smb2_server: add and use smbd_smb2_call()
authorStefan Metzmacher <metze@samba.org>
Mon, 6 Aug 2012 08:42:30 +0000 (10:42 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 7 Aug 2012 09:16:37 +0000 (11:16 +0200)
metze

source3/smbd/smb2_server.c

index 5fcf03c51c2849970b47b1ce14b08a8e646abe64..4ee0e2f0b572dfc1a42f2ff3dca0acdbdb27d6e9 100644 (file)
@@ -131,6 +131,21 @@ const char *smb2_opcode_name(uint16_t opcode)
        return smbd_smb2_table[opcode].name;
 }
 
+static const struct smbd_smb2_dispatch_table *smbd_smb2_call(uint16_t opcode)
+{
+       const struct smbd_smb2_dispatch_table *ret = NULL;
+
+       if (opcode >= ARRAY_SIZE(smbd_smb2_table)) {
+               return NULL;
+       }
+
+       ret = &smbd_smb2_table[opcode];
+
+       SMB_ASSERT(ret->opcode == opcode);
+
+       return ret;
+}
+
 static void print_req_vectors(struct smbd_smb2_request *req)
 {
        int i;
@@ -1638,6 +1653,7 @@ NTSTATUS smbd_smb2_request_verify_sizes(struct smbd_smb2_request *req,
 NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 {
        struct smbXsrv_connection *conn = req->sconn->conn;
+       const struct smbd_smb2_dispatch_table *call = NULL;
        const uint8_t *inhdr;
        uint16_t opcode;
        uint32_t flags;
@@ -1680,6 +1696,11 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                }
        }
 
+       call = smbd_smb2_call(opcode);
+       if (call == NULL) {
+               return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
+       }
+
        allowed_flags = SMB2_HDR_FLAG_CHAINED |
                        SMB2_HDR_FLAG_SIGNED |
                        SMB2_HDR_FLAG_DFS;