mirror of
https://github.com/torvalds/linux.git
synced 2026-09-25 17:42:03 +02:00
can: gs_usb: gs_usb_receive_bulk_callback(): unanchor URL on usb_submit_urb() error
In commit7352e1d593("can: gs_usb: gs_usb_receive_bulk_callback(): fix URB memory leak"), the URB was re-anchored before usb_submit_urb() in gs_usb_receive_bulk_callback() to prevent a leak of this URB during cleanup. However, this patch did not take into account that usb_submit_urb() could fail. The URB remains anchored and usb_kill_anchored_urbs(&parent->rx_submitted) in gs_can_close() loops infinitely since the anchor list never becomes empty. To fix the bug, unanchor the URB when an usb_submit_urb() error occurs, also print an info message. Fixes:7352e1d593("can: gs_usb: gs_usb_receive_bulk_callback(): fix URB memory leak") Reported-by: Jakub Kicinski <kuba@kernel.org> Closes: https://lore.kernel.org/all/20260110223836.3890248-1-kuba@kernel.org/ Link: https://patch.msgid.link/20260116-can_usb-fix-reanchor-v1-1-9d74e7289225@pengutronix.de Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
parent
375629c92f
commit
79a6d1bfe1
|
|
@ -754,6 +754,10 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
|
||||||
usb_anchor_urb(urb, &parent->rx_submitted);
|
usb_anchor_urb(urb, &parent->rx_submitted);
|
||||||
|
|
||||||
rc = usb_submit_urb(urb, GFP_ATOMIC);
|
rc = usb_submit_urb(urb, GFP_ATOMIC);
|
||||||
|
if (!rc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
usb_unanchor_urb(urb);
|
||||||
|
|
||||||
/* USB failure take down all interfaces */
|
/* USB failure take down all interfaces */
|
||||||
if (rc == -ENODEV) {
|
if (rc == -ENODEV) {
|
||||||
|
|
@ -762,6 +766,9 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
|
||||||
if (parent->canch[rc])
|
if (parent->canch[rc])
|
||||||
netif_device_detach(parent->canch[rc]->netdev);
|
netif_device_detach(parent->canch[rc]->netdev);
|
||||||
}
|
}
|
||||||
|
} else if (rc != -ESHUTDOWN && net_ratelimit()) {
|
||||||
|
netdev_info(netdev, "failed to re-submit IN URB: %pe\n",
|
||||||
|
ERR_PTR(urb->status));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user