From nobody Mon Dec 1 22:35:04 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0F4F9303A08 for ; Mon, 1 Dec 2025 09:49:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582592; cv=none; b=P0qpczjK3S+xm1nQcyGO9r4+s4Da+I5fMzJP31dgWn4waTVs1wqkr6tpksNbFlGonxMvDmqL0zinTxozscuVzABTZ/ZQoNjc6qDpPXmuv8iwrAJB8SN1YrAve6U95wZIE/Q1WGh2wdX8YqbpdAarx9z+SJwlM4yKekohQXiVJvw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582592; c=relaxed/simple; bh=/fgLqwsc8OnyA2ubG+QT+yMPG7OFt2umP/TM/quPPlo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dk1Skq7B+Vgo8TYagvZRws+iFM3OFbJkheqZFEHpzJR7C7IcehBywVh7OqDjYC3kIMXg1E30fTZCMNRyDHdTi0pvtCigLcrhM2Bnml7nUhOe1suz+faPuEu9txgplywvcztCFnWon1SDCOb59JoM/q6BpDA0sOuxqKEid0EiKWM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=TUhX4GAd; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="TUhX4GAd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1764582589; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=59cSTudlRXsK26sKpeoMgn05TZUYBjt0EXhk4kqHfH8=; b=TUhX4GAdTuzpvp0LQSlh2qRM+dxfF/sZaxUoscNfqebEiEvy8zxVUzUFQEyTZsogx12tNt rK9bW0w5EKv0S3S6weH/2GQQQhDOE3JkjyuwBIpB2hcToAk1xOzVGW9yI8WDzxtmGAH+rR SOBMw7hMKBIZEPmd4xa4zRx9xi8xpTQ= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-502-CAV4GPb5NHK7InU_7lPyJQ-1; Mon, 01 Dec 2025 04:49:42 -0500 X-MC-Unique: CAV4GPb5NHK7InU_7lPyJQ-1 X-Mimecast-MFC-AGG-ID: CAV4GPb5NHK7InU_7lPyJQ_1764582581 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 74AAD195608F; Mon, 1 Dec 2025 09:49:41 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.14]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 566A418004A3; Mon, 1 Dec 2025 09:49:38 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Paulo Alcantara , Shyam Prasad N , Stefan Metzmacher , linux-cifs@vger.kernel.org, netfs@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Tom Talpey Subject: [PATCH v5 4/9] cifs: Clean up some places where an extra kvec[] was required for rfc1002 Date: Mon, 1 Dec 2025 09:49:08 +0000 Message-ID: <20251201094916.1418415-5-dhowells@redhat.com> In-Reply-To: <20251201094916.1418415-1-dhowells@redhat.com> References: <20251201094916.1418415-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 Content-Type: text/plain; charset="utf-8" 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 cc: Steve French cc: Paulo Alcantara cc: Shyam Prasad N cc: Tom Talpey cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/smb/client/cifsencrypt.c | 52 ++++++++--------------------------- fs/smb/client/cifsproto.h | 7 ----- fs/smb/client/cifstransport.c | 20 ++------------ fs/smb/client/smb1ops.c | 12 +++++--- fs/smb/client/transport.c | 28 +++++++++++-------- 5 files changed, 38 insertions(+), 81 deletions(-) diff --git a/fs/smb/client/cifsencrypt.c b/fs/smb/client/cifsencrypt.c index 1e0ac87c6686..a9a57904c6b1 100644 --- a/fs/smb/client/cifsencrypt.c +++ b/fs/smb/client/cifsencrypt.c @@ -86,26 +86,21 @@ static int cifs_sig_iter(const struct iov_iter *iter, s= ize_t maxsize, int __cifs_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *s= erver, char *signature, struct cifs_calc_sig_ctx *ctx) { - int i; + struct iov_iter iter; ssize_t rc; - struct kvec *iov =3D rqst->rq_iov; - int n_vec =3D rqst->rq_nvec; + size_t size =3D 0; =20 - for (i =3D 0; i < n_vec; i++) { - if (iov[i].iov_len =3D=3D 0) - continue; - if (iov[i].iov_base =3D=3D NULL) { - cifs_dbg(VFS, "null iovec entry\n"); - return -EIO; - } + for (int i =3D 0; i < rqst->rq_nvec; i++) + size +=3D rqst->rq_iov[i].iov_len; =20 - rc =3D 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) <=3D 4) + return -EIO; + + rc =3D cifs_sig_iter(&iter, iov_iter_count(&iter), ctx); + if (rc < 0) + return rc; =20 rc =3D 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_S= erver_Info *server, return rc; } =20 -int cifs_sign_smbv(struct kvec *iov, int n_vec, struct TCP_Server_Info *se= rver, - __u32 *pexpected_response_sequence) -{ - struct smb_rqst rqst =3D { .rq_iov =3D iov, - .rq_nvec =3D 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] =3D { - [0].iov_base =3D (char *)cifs_pdu, - [0].iov_len =3D 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) diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 7d03b425c6bb..4657635e6dfc 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -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) =20 extern int cifs_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *s= erver, __u32 *pexpected_response_sequence_number); -int cifs_sign_smbv(struct kvec *iov, int n_vec, struct TCP_Server_Info *se= rver, - __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); diff --git a/fs/smb/client/cifstransport.c b/fs/smb/client/cifstransport.c index fb8b34944c02..5b07d0555526 100644 --- a/fs/smb/client/cifstransport.c +++ b/fs/smb/client/cifstransport.c @@ -70,22 +70,6 @@ alloc_mid(const struct smb_hdr *smb_buffer, struct TCP_S= erver_Info *server) return smb; } =20 -int -smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer, - unsigned int smb_buf_length) -{ - struct kvec iov[1] =3D { - [0].iov_base =3D smb_buffer, - [0].iov_len =3D smb_buf_length, - }; - struct smb_rqst rqst =3D { - .rq_iov =3D iov, - .rq_nvec =3D ARRAY_SIZE(iov), - }; - - return __smb_send_rqst(server, 1, &rqst); -} - static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf, struct smb_message **ppmidQ) { @@ -369,7 +353,7 @@ int SendReceiveBlockingLock(const unsigned int xid, str= uct cifs_tcon *tcon, return rc; } =20 - rc =3D cifs_sign_smb(in_buf, in_len, server, &smb->sequence_number); + rc =3D cifs_sign_rqst(&rqst, server, &smb->sequence_number); if (rc) { delete_mid(smb); cifs_server_unlock(server); @@ -377,7 +361,7 @@ int SendReceiveBlockingLock(const unsigned int xid, str= uct cifs_tcon *tcon, } =20 smb->mid_state =3D MID_REQUEST_SUBMITTED; - rc =3D smb_send(server, in_buf, in_len); + rc =3D __smb_send_rqst(server, 1, &rqst); cifs_save_when_sent(smb); =20 if (rc < 0) diff --git a/fs/smb/client/smb1ops.c b/fs/smb/client/smb1ops.c index e7d83bca1c38..93c52e4288db 100644 --- a/fs/smb/client/smb1ops.c +++ b/fs/smb/client/smb1ops.c @@ -32,17 +32,21 @@ static int send_nt_cancel(struct TCP_Server_Info *server, struct smb_rqst *rqst, struct smb_message *smb) { - int rc =3D 0; struct smb_hdr *in_buf =3D (struct smb_hdr *)rqst->rq_iov[0].iov_base; - unsigned int in_len =3D rqst->rq_iov[0].iov_len; + struct kvec iov[1]; + struct smb_rqst crqst =3D { .rq_iov =3D iov, .rq_nvec =3D 1 }; + int rc =3D 0; =20 /* +2 for BCC field */ in_buf->Command =3D SMB_COM_NT_CANCEL; in_buf->WordCount =3D 0; put_bcc(0, in_buf); =20 + iov[0].iov_base =3D in_buf; + iov[0].iov_len =3D sizeof(struct smb_hdr) + 2; + cifs_server_lock(server); - rc =3D cifs_sign_smb(in_buf, in_len, server, &smb->sequence_number); + rc =3D cifs_sign_rqst(&crqst, server, &smb->sequence_number); if (rc) { cifs_server_unlock(server); return rc; @@ -54,7 +58,7 @@ send_nt_cancel(struct TCP_Server_Info *server, struct smb= _rqst *rqst, * after signing here. */ --server->sequence_number; - rc =3D smb_send(server, in_buf, in_len); + rc =3D __smb_send_rqst(server, 1, &crqst); if (rc < 0) server->sequence_number--; =20 diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index 2e338e186809..7036acd6542b 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -995,6 +995,9 @@ compound_send_recv(const unsigned int xid, struct cifs_= ses *ses, if ((ses->ses_status =3D=3D SES_NEW) || (optype & CIFS_NEG_OP) || (optype= & CIFS_SESS_OP)) { spin_unlock(&ses->ses_lock); =20 + if (WARN_ON_ONCE(num_rqst !=3D 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); @@ -1043,22 +1046,23 @@ compound_send_recv(const unsigned int xid, struct c= ifs_ses *ses, goto out; } =20 - buf =3D (char *)smb[i]->resp_buf; - resp_iov[i].iov_base =3D buf; - resp_iov[i].iov_len =3D smb[i]->resp_buf_size; - - if (smb[i]->large_buf) - resp_buf_type[i] =3D CIFS_LARGE_BUFFER; - else - resp_buf_type[i] =3D CIFS_SMALL_BUFFER; - rc =3D server->ops->check_receive(smb[i], server, flags & CIFS_LOG_ERROR); =20 - /* mark it so buf will not be freed by delete_mid */ - if ((flags & CIFS_NO_RSP_BUF) =3D=3D 0) - smb[i]->resp_buf =3D NULL; + if (resp_iov) { + buf =3D (char *)smb[i]->resp_buf; + resp_iov[i].iov_base =3D buf; + resp_iov[i].iov_len =3D smb[i]->resp_buf_size; + + if (smb[i]->large_buf) + resp_buf_type[i] =3D CIFS_LARGE_BUFFER; + else + resp_buf_type[i] =3D CIFS_SMALL_BUFFER; =20 + /* mark it so buf will not be freed by delete_mid */ + if ((flags & CIFS_NO_RSP_BUF) =3D=3D 0) + smb[i]->resp_buf =3D NULL; + } } =20 /*