Skip to content

Commit 38a01c9

Browse files
gregkhmarckleinebudde
authored andcommitted
can: ems_usb: ems_usb_read_bulk_callback(): check the proper length of a message
When looking at the data in a USB urb, the actual_length is the size of the buffer passed to the driver, not the transfer_buffer_length which is set by the driver as the max size of the buffer. When parsing the messages in ems_usb_read_bulk_callback() properly check the size both at the beginning of parsing the message to make sure it is big enough for the expected structure, and at the end of the message to make sure we don't overflow past the end of the buffer for the next message. Cc: Vincent Mailhol <mailhol@kernel.org> Cc: Marc Kleine-Budde <mkl@pengutronix.de> Cc: stable@kernel.org Assisted-by: gkh_clanker_2000 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: https://patch.msgid.link/2026022316-answering-strainer-a5db@gregkh Fixes: 702171a ("ems_usb: Added support for EMS CPC-USB/ARM7 CAN/USB interface") Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
1 parent 968b098 commit 38a01c9

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

drivers/net/can/usb/ems_usb.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,11 @@ static void ems_usb_read_bulk_callback(struct urb *urb)
445445
start = CPC_HEADER_SIZE;
446446

447447
while (msg_count) {
448+
if (start + CPC_MSG_HEADER_LEN > urb->actual_length) {
449+
netdev_err(netdev, "format error\n");
450+
break;
451+
}
452+
448453
msg = (struct ems_cpc_msg *)&ibuf[start];
449454

450455
switch (msg->type) {
@@ -474,7 +479,7 @@ static void ems_usb_read_bulk_callback(struct urb *urb)
474479
start += CPC_MSG_HEADER_LEN + msg->length;
475480
msg_count--;
476481

477-
if (start > urb->transfer_buffer_length) {
482+
if (start > urb->actual_length) {
478483
netdev_err(netdev, "format error\n");
479484
break;
480485
}

0 commit comments

Comments
 (0)