[SRU][N:linux-azure][PATCH 1/2 v2] smb: client: fix in-place encryption corruption in SMB2_write()
John Cabaj
john.cabaj at canonical.com
Tue Apr 7 15:37:56 UTC 2026
From: Bharath SM <bharathsm at microsoft.com>
BugLink: https://bugs.launchpad.net/bugs/2147347
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 at vger.kernel.org #6.3+
Acked-by: Henrique Carvalho <henrique.carvalho at suse.com>
Acked-by: Shyam Prasad N <sprasad at microsoft.com>
Acked-by: Paulo Alcantara (Red Hat) <pc at manguebit.org>
Signed-off-by: Bharath SM <bharathsm at microsoft.com>
Signed-off-by: Steve French <stfrench at microsoft.com>
(cherry picked from commit d78840a6a38d312dc1a51a65317bb67e46f0b929)
Signed-off-by: John Cabaj <john.cabaj at canonical.com>
---
fs/smb/client/smb2pdu.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c
index efdd45d7cb9d..da4833ae804f 100644
--- a/fs/smb/client/smb2pdu.c
+++ b/fs/smb/client/smb2pdu.c
@@ -5050,7 +5050,10 @@ SMB2_write(const unsigned int xid, struct cifs_io_parms *io_parms,
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)
smb2_set_replay(server, &rqst);
--
2.43.0
More information about the kernel-team
mailing list