]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cifs: Clean up some places where an extra kvec[] was required for rfc1002
authorDavid Howells <dhowells@redhat.com>
Wed, 6 Aug 2025 12:40:45 +0000 (13:40 +0100)
committerSteve French <stfrench@microsoft.com>
Fri, 5 Dec 2025 23:10:00 +0000 (17:10 -0600)
Clean up some places where previously an extra element in the kvec array
was being used to hold an rfc1002 header for SMB1 (a previous patch removed
this and generated it on the fly as for SMB2/3).

Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
cc: Shyam Prasad N <sprasad@microsoft.com>
cc: Tom Talpey <tom@talpey.com>
cc: linux-cifs@vger.kernel.org
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/cifsencrypt.c
fs/smb/client/cifsproto.h
fs/smb/client/cifstransport.c
fs/smb/client/smb1ops.c
fs/smb/client/transport.c

index 1e0ac87c6686c68506dd90399544bf95848997ca..a9a57904c6b1852a6bf839a1dfdec714d4a99701 100644 (file)
@@ -86,26 +86,21 @@ static int cifs_sig_iter(const struct iov_iter *iter, size_t maxsize,
 int __cifs_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server,
                          char *signature, struct cifs_calc_sig_ctx *ctx)
 {
-       int i;
+       struct iov_iter iter;
        ssize_t rc;
-       struct kvec *iov = rqst->rq_iov;
-       int n_vec = rqst->rq_nvec;
+       size_t size = 0;
 
-       for (i = 0; i < n_vec; i++) {
-               if (iov[i].iov_len == 0)
-                       continue;
-               if (iov[i].iov_base == NULL) {
-                       cifs_dbg(VFS, "null iovec entry\n");
-                       return -EIO;
-               }
+       for (int i = 0; i < rqst->rq_nvec; i++)
+               size += rqst->rq_iov[i].iov_len;
 
-               rc = cifs_sig_update(ctx, iov[i].iov_base, iov[i].iov_len);
-               if (rc) {
-                       cifs_dbg(VFS, "%s: Could not update with payload\n",
-                                __func__);
-                       return rc;
-               }
-       }
+       iov_iter_kvec(&iter, ITER_SOURCE, rqst->rq_iov, rqst->rq_nvec, size);
+
+       if (iov_iter_count(&iter) <= 4)
+               return -EIO;
+
+       rc = cifs_sig_iter(&iter, iov_iter_count(&iter), ctx);
+       if (rc < 0)
+               return rc;
 
        rc = cifs_sig_iter(&rqst->rq_iter, iov_iter_count(&rqst->rq_iter), ctx);
        if (rc < 0)
@@ -186,29 +181,6 @@ int cifs_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server,
        return rc;
 }
 
-int cifs_sign_smbv(struct kvec *iov, int n_vec, struct TCP_Server_Info *server,
-                  __u32 *pexpected_response_sequence)
-{
-       struct smb_rqst rqst = { .rq_iov = iov,
-                                .rq_nvec = n_vec };
-
-       return cifs_sign_rqst(&rqst, server, pexpected_response_sequence);
-}
-
-/* must be called with server->srv_mutex held */
-int cifs_sign_smb(struct smb_hdr *cifs_pdu, unsigned int pdu_len,
-                 struct TCP_Server_Info *server,
-                 __u32 *pexpected_response_sequence_number)
-{
-       struct kvec iov[1] = {
-               [0].iov_base = (char *)cifs_pdu,
-               [0].iov_len = pdu_len,
-       };
-
-       return cifs_sign_smbv(iov, ARRAY_SIZE(iov), server,
-                             pexpected_response_sequence_number);
-}
-
 int cifs_verify_signature(struct smb_rqst *rqst,
                          struct TCP_Server_Info *server,
                          __u32 expected_sequence_number)
index 7fb40684a584dba4a25f62625b57afd3a76b0eb6..13e0367e0e10ff4866b00fd95b798c7e0058f18f 100644 (file)
@@ -30,8 +30,6 @@ extern void cifs_buf_release(void *);
 extern struct smb_hdr *cifs_small_buf_get(void);
 extern void cifs_small_buf_release(void *);
 extern void free_rsp_buf(int, void *);
-extern int smb_send(struct TCP_Server_Info *, struct smb_hdr *,
-                       unsigned int /* length */);
 extern int smb_send_kvec(struct TCP_Server_Info *server,
                         struct msghdr *msg,
                         size_t *sent);
@@ -562,11 +560,6 @@ extern void tconInfoFree(struct cifs_tcon *tcon, enum smb3_tcon_ref_trace trace)
 
 extern int cifs_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server,
                   __u32 *pexpected_response_sequence_number);
-int cifs_sign_smbv(struct kvec *iov, int n_vec, struct TCP_Server_Info *server,
-                  __u32 *pexpected_response_sequence);
-int cifs_sign_smb(struct smb_hdr *cifs_pdu, unsigned int pdu_len,
-                 struct TCP_Server_Info *server,
-                 __u32 *pexpected_response_sequence_number);
 int cifs_verify_signature(struct smb_rqst *rqst,
                          struct TCP_Server_Info *server,
                          __u32 expected_sequence_number);
index 1a28d361b1f761d5f4fe7c8c9d5d306cffd99317..22615890f35cf4ea486d20799f2c28e77e1a7ae0 100644 (file)
@@ -70,22 +70,6 @@ alloc_mid(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server)
        return temp;
 }
 
-int
-smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer,
-        unsigned int smb_buf_length)
-{
-       struct kvec iov[1] = {
-               [0].iov_base = smb_buffer,
-               [0].iov_len = smb_buf_length,
-       };
-       struct smb_rqst rqst = {
-               .rq_iov = iov,
-               .rq_nvec = ARRAY_SIZE(iov),
-       };
-
-       return __smb_send_rqst(server, 1, &rqst);
-}
-
 static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf,
                        struct mid_q_entry **ppmidQ)
 {
@@ -369,7 +353,7 @@ int SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
                return rc;
        }
 
-       rc = cifs_sign_smb(in_buf, in_len, server, &mid->sequence_number);
+       rc = cifs_sign_rqst(&rqst, server, &mid->sequence_number);
        if (rc) {
                delete_mid(mid);
                cifs_server_unlock(server);
@@ -377,7 +361,7 @@ int SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
        }
 
        mid->mid_state = MID_REQUEST_SUBMITTED;
-       rc = smb_send(server, in_buf, in_len);
+       rc = __smb_send_rqst(server, 1, &rqst);
        cifs_save_when_sent(mid);
 
        if (rc < 0)
index 19e0fbb902fd84ea9356beaaa5a3658b7c1f78d5..37a37758144704da2cb4081aee80a1ed384c7c00 100644 (file)
@@ -33,17 +33,21 @@ static int
 send_nt_cancel(struct TCP_Server_Info *server, struct smb_rqst *rqst,
               struct mid_q_entry *mid)
 {
-       int rc = 0;
        struct smb_hdr *in_buf = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
-       unsigned int in_len = rqst->rq_iov[0].iov_len;
+       struct kvec iov[1];
+       struct smb_rqst crqst = { .rq_iov = iov, .rq_nvec = 1 };
+       int rc = 0;
 
        /* +2 for BCC field */
        in_buf->Command = SMB_COM_NT_CANCEL;
        in_buf->WordCount = 0;
        put_bcc(0, in_buf);
 
+       iov[0].iov_base = in_buf;
+       iov[0].iov_len  = sizeof(struct smb_hdr) + 2;
+
        cifs_server_lock(server);
-       rc = cifs_sign_smb(in_buf, in_len, server, &mid->sequence_number);
+       rc = cifs_sign_rqst(&crqst, server, &mid->sequence_number);
        if (rc) {
                cifs_server_unlock(server);
                return rc;
@@ -55,7 +59,7 @@ send_nt_cancel(struct TCP_Server_Info *server, struct smb_rqst *rqst,
         * after signing here.
         */
        --server->sequence_number;
-       rc = smb_send(server, in_buf, in_len);
+       rc = __smb_send_rqst(server, 1, &crqst);
        if (rc < 0)
                server->sequence_number--;
 
index 2f6b4cf33b6d456f973f1c258878c95291d6acba..ddd3950df22f7e8b472c4f6c81f446bdc24d0c35 100644 (file)
@@ -994,6 +994,9 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
        if ((ses->ses_status == SES_NEW) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP)) {
                spin_unlock(&ses->ses_lock);
 
+               if (WARN_ON_ONCE(num_rqst != 1 || !resp_iov))
+                       return -EINVAL;
+
                cifs_server_lock(server);
                smb311_update_preauth_hash(ses, server, rqst[0].rq_iov, rqst[0].rq_nvec);
                cifs_server_unlock(server);
@@ -1041,22 +1044,23 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
                        goto out;
                }
 
-               buf = (char *)mid[i]->resp_buf;
-               resp_iov[i].iov_base = buf;
-               resp_iov[i].iov_len = mid[i]->resp_buf_size;
-
-               if (mid[i]->large_buf)
-                       resp_buf_type[i] = CIFS_LARGE_BUFFER;
-               else
-                       resp_buf_type[i] = CIFS_SMALL_BUFFER;
-
                rc = server->ops->check_receive(mid[i], server,
-                                                    flags & CIFS_LOG_ERROR);
+                                               flags & CIFS_LOG_ERROR);
+
+               if (resp_iov) {
+                       buf = (char *)mid[i]->resp_buf;
+                       resp_iov[i].iov_base = buf;
+                       resp_iov[i].iov_len = mid[i]->resp_buf_size;
 
-               /* mark it so buf will not be freed by delete_mid */
-               if ((flags & CIFS_NO_RSP_BUF) == 0)
-                       mid[i]->resp_buf = NULL;
+                       if (mid[i]->large_buf)
+                               resp_buf_type[i] = CIFS_LARGE_BUFFER;
+                       else
+                               resp_buf_type[i] = CIFS_SMALL_BUFFER;
 
+                       /* mark it so buf will not be freed by delete_mid */
+                       if ((flags & CIFS_NO_RSP_BUF) == 0)
+                               mid[i]->resp_buf = NULL;
+               }
        }
 
        /*