Skip to content

Commit 5282491

Browse files
namjaejeonsmfrench
authored andcommitted
ksmbd: smbdirect: validate data_offset and data_length field of smb_direct_data_transfer
If data_offset and data_length of smb_direct_data_transfer struct are invalid, out of bounds issue could happen. This patch validate data_offset and data_length field in recv_done. Cc: [email protected] Fixes: 2ea086e ("ksmbd: add buffer validation for smb direct") Reviewed-by: Stefan Metzmacher <[email protected]> Reported-by: Luigino Camastra, Aisle Research <[email protected]> Signed-off-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent d162694 commit 5282491

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

fs/smb/server/transport_rdma.c

Lines changed: 9 additions & 8 deletions
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_length;
557+
unsigned int data_offset, data_length;
558558
int avail_recvmsg_count, receive_credits;
559559

560560
if (wc->byte_len <
@@ -565,14 +565,15 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
565565
}
566566

567567
data_length = le32_to_cpu(data_transfer->data_length);
568-
if (data_length) {
569-
if (wc->byte_len < sizeof(struct smb_direct_data_transfer) +
570-
(u64)data_length) {
571-
put_recvmsg(t, recvmsg);
572-
smb_direct_disconnect_rdma_connection(t);
573-
return;
574-
}
568+
data_offset = le32_to_cpu(data_transfer->data_offset);
569+
if (wc->byte_len < data_offset ||
570+
wc->byte_len < (u64)data_offset + data_length) {
571+
put_recvmsg(t, recvmsg);
572+
smb_direct_disconnect_rdma_connection(t);
573+
return;
574+
}
575575

576+
if (data_length) {
576577
if (t->full_packet_received)
577578
recvmsg->first_segment = true;
578579

0 commit comments

Comments
 (0)