Skip to content

Commit e1868ba

Browse files
metze-sambasmfrench
authored andcommitted
ksmbd: smbdirect: verify remaining_data_length respects max_fragmented_recv_size
This is inspired by the check for data_offset + data_length. Cc: Steve French <[email protected]> Cc: Tom Talpey <[email protected]> Cc: [email protected] Cc: [email protected] Cc: [email protected] Fixes: 2ea086e ("ksmbd: add buffer validation for smb direct") Acked-by: Namjae Jeon <[email protected]> Signed-off-by: Stefan Metzmacher <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent 5282491 commit e1868ba

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
@@ -554,7 +554,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
554554
case SMB_DIRECT_MSG_DATA_TRANSFER: {
555555
struct smb_direct_data_transfer *data_transfer =
556556
(struct smb_direct_data_transfer *)recvmsg->packet;
557-
unsigned int data_offset, data_length;
557+
u32 remaining_data_length, data_offset, data_length;
558558
int avail_recvmsg_count, receive_credits;
559559

560560
if (wc->byte_len <
@@ -564,6 +564,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
564564
return;
565565
}
566566

567+
remaining_data_length = le32_to_cpu(data_transfer->remaining_data_length);
567568
data_length = le32_to_cpu(data_transfer->data_length);
568569
data_offset = le32_to_cpu(data_transfer->data_offset);
569570
if (wc->byte_len < data_offset ||
@@ -572,6 +573,14 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
572573
smb_direct_disconnect_rdma_connection(t);
573574
return;
574575
}
576+
if (remaining_data_length > t->max_fragmented_recv_size ||
577+
data_length > t->max_fragmented_recv_size ||
578+
(u64)remaining_data_length + (u64)data_length >
579+
(u64)t->max_fragmented_recv_size) {
580+
put_recvmsg(t, recvmsg);
581+
smb_direct_disconnect_rdma_connection(t);
582+
return;
583+
}
575584

576585
if (data_length) {
577586
if (t->full_packet_received)

0 commit comments

Comments
 (0)