Skip to content

Commit 952caa5

Browse files
gregkhmarckleinebudde
authored andcommitted
can: usb: f81604: correctly anchor the urb in the read bulk callback
When submitting an urb, that is using the anchor pattern, it needs to be anchored before submitting it otherwise it could be leaked if usb_kill_anchored_urbs() is called. This logic is correctly done elsewhere in the driver, except in the read bulk callback so do that here also. Cc: Ji-Ze Hong (Peter Hong) <peter_hong@fintek.com.tw> Cc: Marc Kleine-Budde <mkl@pengutronix.de> Cc: Vincent Mailhol <mailhol@kernel.org> Cc: stable@kernel.org Assisted-by: gkh_clanker_2000 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: https://patch.msgid.link/2026022334-starlight-scaling-2cea@gregkh Fixes: 88da174 ("can: usb: f81604: add Fintek F81604 support") Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
1 parent 51f9478 commit 952caa5

1 file changed

Lines changed: 13 additions & 2 deletions

File tree

drivers/net/can/usb/f81604.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ static void f81604_read_bulk_callback(struct urb *urb)
413413
{
414414
struct f81604_can_frame *frame = urb->transfer_buffer;
415415
struct net_device *netdev = urb->context;
416+
struct f81604_port_priv *priv = netdev_priv(netdev);
416417
int ret;
417418

418419
if (!netif_device_present(netdev))
@@ -445,10 +446,15 @@ static void f81604_read_bulk_callback(struct urb *urb)
445446
f81604_process_rx_packet(netdev, frame);
446447

447448
resubmit_urb:
449+
usb_anchor_urb(urb, &priv->urbs_anchor);
448450
ret = usb_submit_urb(urb, GFP_ATOMIC);
451+
if (!ret)
452+
return;
453+
usb_unanchor_urb(urb);
454+
449455
if (ret == -ENODEV)
450456
netif_device_detach(netdev);
451-
else if (ret)
457+
else
452458
netdev_err(netdev,
453459
"%s: failed to resubmit read bulk urb: %pe\n",
454460
__func__, ERR_PTR(ret));
@@ -652,10 +658,15 @@ static void f81604_read_int_callback(struct urb *urb)
652658
f81604_handle_tx(priv, data);
653659

654660
resubmit_urb:
661+
usb_anchor_urb(urb, &priv->urbs_anchor);
655662
ret = usb_submit_urb(urb, GFP_ATOMIC);
663+
if (!ret)
664+
return;
665+
usb_unanchor_urb(urb);
666+
656667
if (ret == -ENODEV)
657668
netif_device_detach(netdev);
658-
else if (ret)
669+
else
659670
netdev_err(netdev, "%s: failed to resubmit int urb: %pe\n",
660671
__func__, ERR_PTR(ret));
661672
}

0 commit comments

Comments
 (0)