@@ -554,7 +554,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
554
554
case SMB_DIRECT_MSG_DATA_TRANSFER : {
555
555
struct smb_direct_data_transfer * data_transfer =
556
556
(struct smb_direct_data_transfer * )recvmsg -> packet ;
557
- unsigned int data_offset , data_length ;
557
+ u32 remaining_data_length , data_offset , data_length ;
558
558
int avail_recvmsg_count , receive_credits ;
559
559
560
560
if (wc -> byte_len <
@@ -564,6 +564,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
564
564
return ;
565
565
}
566
566
567
+ remaining_data_length = le32_to_cpu (data_transfer -> remaining_data_length );
567
568
data_length = le32_to_cpu (data_transfer -> data_length );
568
569
data_offset = le32_to_cpu (data_transfer -> data_offset );
569
570
if (wc -> byte_len < data_offset ||
@@ -572,6 +573,14 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
572
573
smb_direct_disconnect_rdma_connection (t );
573
574
return ;
574
575
}
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
+ }
575
584
576
585
if (data_length ) {
577
586
if (t -> full_packet_received )
0 commit comments