CIFS: Only send SMB2_NEGOTIATE command on new TCP connections
authorPavel Shilovsky <piastryyy@gmail.com>
Tue, 5 Mar 2019 23:51:55 +0000 (15:51 -0800)
committerSteve French <stfrench@microsoft.com>
Wed, 6 Mar 2019 00:14:27 +0000 (18:14 -0600)
Do not allow commands other than SMB2_NEGOTIATE to be sent over
recently established TCP connections. Return -EAGAIN to let upper
layers handle it properly.

Signed-off-by: Pavel Shilovsky <pshilov@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/smb2transport.c

index fa1fec2e3c8d6fef9af1032e8f058063ca38734c..d1181572758b186c67fccaab572b502aef7497fc 100644 (file)
@@ -619,6 +619,10 @@ smb2_get_mid_entry(struct cifs_ses *ses, struct smb2_sync_hdr *shdr,
                return -EAGAIN;
        }
 
+       if (ses->server->tcpStatus == CifsNeedNegotiate &&
+          shdr->Command != SMB2_NEGOTIATE)
+               return -EAGAIN;
+
        if (ses->status == CifsNew) {
                if ((shdr->Command != SMB2_SESSION_SETUP) &&
                    (shdr->Command != SMB2_NEGOTIATE))
@@ -702,6 +706,10 @@ smb2_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst)
                        (struct smb2_sync_hdr *)rqst->rq_iov[0].iov_base;
        struct mid_q_entry *mid;
 
+       if (server->tcpStatus == CifsNeedNegotiate &&
+          shdr->Command != SMB2_NEGOTIATE)
+               return ERR_PTR(-EAGAIN);
+
        smb2_seq_num_into_buf(server, shdr);
 
        mid = smb2_mid_entry_alloc(shdr, server);