Skip to content

Commit 196a3a7

Browse files
metze-sambagregkh
authored andcommitted
ksmbd: smbdirect: verify remaining_data_length respects max_fragmented_recv_size
commit e1868ba upstream. This is inspired by the check for data_offset + data_length. Cc: Steve French <smfrench@gmail.com> Cc: Tom Talpey <tom@talpey.com> Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Cc: stable@vger.kernel.org Fixes: 2ea086e ("ksmbd: add buffer validation for smb direct") Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Stefan Metzmacher <metze@samba.org> Signed-off-by: Steve French <stfrench@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent bdaab5c commit 196a3a7

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

fs/smb/server/transport_rdma.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
548548
case SMB_DIRECT_MSG_DATA_TRANSFER: {
549549
struct smb_direct_data_transfer *data_transfer =
550550
(struct smb_direct_data_transfer *)recvmsg->packet;
551-
unsigned int data_offset, data_length;
551+
u32 remaining_data_length, data_offset, data_length;
552552
int avail_recvmsg_count, receive_credits;
553553

554554
if (wc->byte_len <
@@ -558,6 +558,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
558558
return;
559559
}
560560

561+
remaining_data_length = le32_to_cpu(data_transfer->remaining_data_length);
561562
data_length = le32_to_cpu(data_transfer->data_length);
562563
data_offset = le32_to_cpu(data_transfer->data_offset);
563564
if (wc->byte_len < data_offset ||
@@ -566,6 +567,14 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
566567
smb_direct_disconnect_rdma_connection(t);
567568
return;
568569
}
570+
if (remaining_data_length > t->max_fragmented_recv_size ||
571+
data_length > t->max_fragmented_recv_size ||
572+
(u64)remaining_data_length + (u64)data_length >
573+
(u64)t->max_fragmented_recv_size) {
574+
put_recvmsg(t, recvmsg);
575+
smb_direct_disconnect_rdma_connection(t);
576+
return;
577+
}
569578

570579
if (data_length) {
571580
if (t->full_packet_received)

0 commit comments

Comments
 (0)