Skip to content

Commit bdaab5c

Browse files
namjaejeongregkh
authored andcommitted
ksmbd: smbdirect: validate data_offset and data_length field of smb_direct_data_transfer
commit 5282491 upstream. 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: stable@vger.kernel.org Fixes: 2ea086e ("ksmbd: add buffer validation for smb direct") Reviewed-by: Stefan Metzmacher <metze@samba.org> Reported-by: Luigino Camastra, Aisle Research <luigino.camastra@aisle.com> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 2786879 commit bdaab5c

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
@@ -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_length;
551+
unsigned int data_offset, data_length;
552552
int avail_recvmsg_count, receive_credits;
553553

554554
if (wc->byte_len <
@@ -559,14 +559,15 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
559559
}
560560

561561
data_length = le32_to_cpu(data_transfer->data_length);
562-
if (data_length) {
563-
if (wc->byte_len < sizeof(struct smb_direct_data_transfer) +
564-
(u64)data_length) {
565-
put_recvmsg(t, recvmsg);
566-
smb_direct_disconnect_rdma_connection(t);
567-
return;
568-
}
562+
data_offset = le32_to_cpu(data_transfer->data_offset);
563+
if (wc->byte_len < data_offset ||
564+
wc->byte_len < (u64)data_offset + data_length) {
565+
put_recvmsg(t, recvmsg);
566+
smb_direct_disconnect_rdma_connection(t);
567+
return;
568+
}
569569

570+
if (data_length) {
570571
if (t->full_packet_received)
571572
recvmsg->first_segment = true;
572573

0 commit comments

Comments
 (0)