]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
smb: client: fix in-place encryption corruption in SMB2_write()
authorBharath SM <bharathsm@microsoft.com>
Mon, 9 Mar 2026 10:30:49 +0000 (16:00 +0530)
committerSteve French <stfrench@microsoft.com>
Tue, 10 Mar 2026 22:22:03 +0000 (17:22 -0500)
SMB2_write() places write payload in iov[1..n] as part of rq_iov.
smb3_init_transform_rq() pointer-shares rq_iov, so crypt_message()
encrypts iov[1] in-place, replacing the original plaintext with
ciphertext. On a replayable error, the retry sends the same iov[1]
which now contains ciphertext instead of the original data,
resulting in corruption.

The corruption is most likely to be observed when connections are
unstable, as reconnects trigger write retries that re-send the
already-encrypted data.

This affects SFU mknod, MF symlinks, etc. On kernels before
6.10 (prior to the netfs conversion), sync writes also used
this path and were similarly affected. The async write path
wasn't unaffected as it uses rq_iter which gets deep-copied.

Fix by moving the write payload into rq_iter via iov_iter_kvec(),
so smb3_init_transform_rq() deep-copies it before encryption.

Cc: stable@vger.kernel.org #6.3+
Acked-by: Henrique Carvalho <henrique.carvalho@suse.com>
Acked-by: Shyam Prasad N <sprasad@microsoft.com>
Acked-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
Signed-off-by: Bharath SM <bharathsm@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/smb2pdu.c

index c43ca74e8704c632d3598abc7f302822e20202ba..5188218c25be4202b631a37df7cb06f831abf674 100644 (file)
@@ -5307,7 +5307,10 @@ replay_again:
 
        memset(&rqst, 0, sizeof(struct smb_rqst));
        rqst.rq_iov = iov;
-       rqst.rq_nvec = n_vec + 1;
+       /* iov[0] is the SMB header; move payload to rq_iter for encryption safety */
+       rqst.rq_nvec = 1;
+       iov_iter_kvec(&rqst.rq_iter, ITER_SOURCE, &iov[1], n_vec,
+                     io_parms->length);
 
        if (retries) {
                /* Back-off before retry */