s3:smbd: disconnect the socket if we got an unexpected request
authorStefan Metzmacher <metze@samba.org>
Fri, 23 Sep 2011 04:37:35 +0000 (06:37 +0200)
committerKarolin Seeger <kseeger@samba.org>
Thu, 13 Oct 2011 18:09:46 +0000 (20:09 +0200)
If we got a SMB2_OP_NEGPROT after the protocol is already negotiated
or if we got a non SMB2_OP_NEGPROT before the protocol was negotiated
we should close the connection (as windows does).

metze

Autobuild-User: Stefan Metzmacher <metze@samba.org>
Autobuild-Date: Fri Sep 23 12:30:50 CEST 2011 on sn-devel-104
(cherry picked from commit 5494856294384df4360d85e68abc03c43dc16e06)

source3/smbd/smb2_negprot.c
source3/smbd/smb2_server.c

index 414f59054046df2259274ebd890b09a5dad3a382..a9d432ac76d6bd3f5df5dcf6752b2e73e767cdf2 100644 (file)
@@ -81,7 +81,6 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
        uint32_t max_read = lp_smb2_max_read();
        uint32_t max_write = lp_smb2_max_write();
 
-/* TODO: drop the connection with INVALID_PARAMETER */
 
        status = smbd_smb2_request_verify_sizes(req, 0x24);
        if (!NT_STATUS_IS_OK(status)) {
index 0d22d84deee801d1f072939aac62be78788a753b..1c50d217765b923f4ef67dfe75c2eec186cc7cc5 100644 (file)
@@ -1203,6 +1203,26 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                smb2_opcode_name(opcode),
                (unsigned long long)mid));
 
+       if (get_Protocol() >= PROTOCOL_SMB2) {
+               /*
+                * once the protocol is negotiated
+                * SMB2_OP_NEGPROT is not allowed anymore
+                */
+               if (opcode == SMB2_OP_NEGPROT) {
+                       /* drop the connection */
+                       return NT_STATUS_INVALID_PARAMETER;
+               }
+       } else {
+               /*
+                * if the protocol is not negotiated yet
+                * only SMB2_OP_NEGPROT is allowed.
+                */
+               if (opcode != SMB2_OP_NEGPROT) {
+                       /* drop the connection */
+                       return NT_STATUS_INVALID_PARAMETER;
+               }
+       }
+
        allowed_flags = SMB2_HDR_FLAG_CHAINED |
                        SMB2_HDR_FLAG_SIGNED |
                        SMB2_HDR_FLAG_DFS;