s3:smbd: unimplement FSCTL_VALIDATE_NEGOTIATE_INFO with "server max protocol = SMB2_02"
authorStefan Metzmacher <metze@samba.org>
Fri, 5 May 2017 16:49:37 +0000 (18:49 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 18 Feb 2019 11:55:14 +0000 (12:55 +0100)
A client that supports SMB3 will do a signed FSCTL_VALIDATE_NEGOTIATE_INFO
after a tree connect. This FSCTL_VALIDATE_NEGOTIATE_INFO call contains
the client capabilities, client guid, security mode and the array of supported
dialects. But if SMB 2.02 is negotiated the doesn't send these values to the
server in the first connection attempt (when the client starts with a SMB1 Negotiate).

Windows servers that only support SMB2 just return NT_STATUS_FILE_CLOSED
as answer to FSCTL_VALIDATE_NEGOTIATE_INFO.

We should do the same if we just pretend to support SMB 2.02,
as SMB 2.10 always include an SMB2 Negotiate request we can leave it as is.

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

Signed-off-by: Stefan Metzmacher <metze@samba.org>
source3/smbd/smb2_ioctl_network_fs.c

index 31b3c95c4b0de3f6ffe1275300adb481bfd706f0..c0d175609ec7e9359208ab19cfa917f2546a0857 100644 (file)
@@ -420,6 +420,23 @@ static NTSTATUS fsctl_validate_neg_info(TALLOC_CTX *mem_ctx,
        NTSTATUS status;
        enum protocol_types protocol = PROTOCOL_NONE;
 
+       if (lp_server_max_protocol() <= PROTOCOL_SMB2_02) {
+               /*
+                * With SMB 2.02 we didn't get the
+                * capabitities, client guid, security mode
+                * and dialects the client would have offered.
+                *
+                * So we behave compatible with a true
+                * SMB 2.02 server and return NT_STATUS_FILE_CLOSED.
+                *
+                * As SMB >= 2.10 offers the two phase SMB2 Negotiate
+                * we keep supporting FSCTL_VALIDATE_NEGOTIATE_INFO
+                * starting with SMB 2.10, while Windows only supports
+                * it starting with SMB > 2.10.
+                */
+               return NT_STATUS_FILE_CLOSED;
+       }
+
        if (in_input->length < 0x18) {
                return NT_STATUS_INVALID_PARAMETER;
        }