Skip to content

Commit 92e64f1

Browse files
bharathsm-msgregkh
authored andcommitted
smb: client: fix in-place encryption corruption in SMB2_write()
commit d78840a upstream. 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 qualcomm-linux#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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 9509b65 commit 92e64f1

1 file changed

Lines changed: 4 additions & 1 deletion

File tree

fs/smb/client/smb2pdu.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5172,7 +5172,10 @@ SMB2_write(const unsigned int xid, struct cifs_io_parms *io_parms,
51725172

51735173
memset(&rqst, 0, sizeof(struct smb_rqst));
51745174
rqst.rq_iov = iov;
5175-
rqst.rq_nvec = n_vec + 1;
5175+
/* iov[0] is the SMB header; move payload to rq_iter for encryption safety */
5176+
rqst.rq_nvec = 1;
5177+
iov_iter_kvec(&rqst.rq_iter, ITER_SOURCE, &iov[1], n_vec,
5178+
io_parms->length);
51765179

51775180
if (retries)
51785181
smb2_set_replay(server, &rqst);

0 commit comments

Comments
 (0)