smb3: move server check earlier when setting channel sequence number
authorSteve French <stfrench@microsoft.com>
Tue, 12 Sep 2023 19:08:36 +0000 (14:08 -0500)
committerSteve French <stfrench@microsoft.com>
Tue, 12 Sep 2023 19:21:32 +0000 (14:21 -0500)
Smatch warning pointed out by Dan Carpenter:

    fs/smb/client/smb2pdu.c:105 smb2_hdr_assemble()
    warn: variable dereferenced before check 'server' (see line 95)

Fixes: 09ee7a3bf866 ("[SMB3] send channel sequence number in SMB3 requests after reconnects")
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/smb2pdu.c

index 092b008..3403188 100644 (file)
@@ -92,17 +92,22 @@ smb2_hdr_assemble(struct smb2_hdr *shdr, __le16 smb2_cmd,
        shdr->ProtocolId = SMB2_PROTO_NUMBER;
        shdr->StructureSize = cpu_to_le16(64);
        shdr->Command = smb2_cmd;
-       if (server->dialect >= SMB30_PROT_ID) {
-               /* After reconnect SMB3 must set ChannelSequence on subsequent reqs */
-               smb3_hdr = (struct smb3_hdr_req *)shdr;
-               /* if primary channel is not set yet, use default channel for chan sequence num */
-               if (SERVER_IS_CHAN(server))
-                       smb3_hdr->ChannelSequence =
-                               cpu_to_le16(server->primary_server->channel_sequence_num);
-               else
-                       smb3_hdr->ChannelSequence = cpu_to_le16(server->channel_sequence_num);
-       }
+
        if (server) {
+               /* After reconnect SMB3 must set ChannelSequence on subsequent reqs */
+               if (server->dialect >= SMB30_PROT_ID) {
+                       smb3_hdr = (struct smb3_hdr_req *)shdr;
+                       /*
+                        * if primary channel is not set yet, use default
+                        * channel for chan sequence num
+                        */
+                       if (SERVER_IS_CHAN(server))
+                               smb3_hdr->ChannelSequence =
+                                       cpu_to_le16(server->primary_server->channel_sequence_num);
+                       else
+                               smb3_hdr->ChannelSequence =
+                                       cpu_to_le16(server->channel_sequence_num);
+               }
                spin_lock(&server->req_lock);
                /* Request up to 10 credits but don't go over the limit. */
                if (server->credits >= server->max_credits)