Skip to content

Commit 0c73772

Browse files
pip-izonymarckleinebudde
authored andcommitted
can: kvaser_usb: leaf: Fix potential infinite loop in command parsers
The `kvaser_usb_leaf_wait_cmd()` and `kvaser_usb_leaf_read_bulk_callback` functions contain logic to zero-length commands. These commands are used to align data to the USB endpoint's wMaxPacketSize boundary. The driver attempts to skip these placeholders by aligning the buffer position `pos` to the next packet boundary using `round_up()` function. However, if zero-length command is found exactly on a packet boundary (i.e., `pos` is a multiple of wMaxPacketSize, including 0), `round_up` function will return the unchanged value of `pos`. This prevents `pos` to be increased, causing an infinite loop in the parsing logic. This patch fixes this in the function by using `pos + 1` instead. This ensures that even if `pos` is on a boundary, the calculation is based on `pos + 1`, forcing `round_up()` to always return the next aligned boundary. Fixes: 7259124 ("can: kvaser_usb: Split driver into kvaser_usb_core.c and kvaser_usb_leaf.c") Signed-off-by: Seungjin Bae <eeodqql09@gmail.com> Reviewed-by: Jimmy Assarsson <extja@kvaser.com> Tested-by: Jimmy Assarsson <extja@kvaser.com> Link: https://patch.msgid.link/20251023162709.348240-1-eeodqql09@gmail.com Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
1 parent 5442a9d commit 0c73772

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ static int kvaser_usb_leaf_wait_cmd(const struct kvaser_usb *dev, u8 id,
685685
* for further details.
686686
*/
687687
if (tmp->len == 0) {
688-
pos = round_up(pos,
688+
pos = round_up(pos + 1,
689689
le16_to_cpu
690690
(dev->bulk_in->wMaxPacketSize));
691691
continue;
@@ -1732,7 +1732,7 @@ static void kvaser_usb_leaf_read_bulk_callback(struct kvaser_usb *dev,
17321732
* number of events in case of a heavy rx load on the bus.
17331733
*/
17341734
if (cmd->len == 0) {
1735-
pos = round_up(pos, le16_to_cpu
1735+
pos = round_up(pos + 1, le16_to_cpu
17361736
(dev->bulk_in->wMaxPacketSize));
17371737
continue;
17381738
}

0 commit comments

Comments
 (0)