Skip to content

Commit 70458a3

Browse files
Merge patch series "can: usb: fix URB memory leaks"
Marc Kleine-Budde <mkl@pengutronix.de> says: An URB memory leak [1][2] was recently fixed in the gs_usb driver. The driver did not take into account that completed URBs are no longer anchored, causing them to be lost during ifdown. The memory leak was fixed by re-anchoring the URBs in the URB completion callback. Several USB CAN drivers are affected by the same error. Fix them accordingly. [1] https://lore.kernel.org/all/20260109135311.576033-3-mkl@pengutronix.de/ [2] https://lore.kernel.org/all/20260116-can_usb-fix-reanchor-v1-1-9d74e7289225@pengutronix.de/ Link: https://patch.msgid.link/20260116-can_usb-fix-memory-leak-v2-0-4b8cb2915571@pengutronix.de Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
2 parents 79a6d1b + f7a980b commit 70458a3

5 files changed

Lines changed: 37 additions & 5 deletions

File tree

drivers/net/can/usb/ems_usb.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,11 +486,17 @@ static void ems_usb_read_bulk_callback(struct urb *urb)
486486
urb->transfer_buffer, RX_BUFFER_SIZE,
487487
ems_usb_read_bulk_callback, dev);
488488

489+
usb_anchor_urb(urb, &dev->rx_submitted);
490+
489491
retval = usb_submit_urb(urb, GFP_ATOMIC);
492+
if (!retval)
493+
return;
494+
495+
usb_unanchor_urb(urb);
490496

491497
if (retval == -ENODEV)
492498
netif_device_detach(netdev);
493-
else if (retval)
499+
else
494500
netdev_err(netdev,
495501
"failed resubmitting read bulk urb: %d\n", retval);
496502
}

drivers/net/can/usb/esd_usb.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,13 +541,20 @@ static void esd_usb_read_bulk_callback(struct urb *urb)
541541
urb->transfer_buffer, ESD_USB_RX_BUFFER_SIZE,
542542
esd_usb_read_bulk_callback, dev);
543543

544+
usb_anchor_urb(urb, &dev->rx_submitted);
545+
544546
err = usb_submit_urb(urb, GFP_ATOMIC);
547+
if (!err)
548+
return;
549+
550+
usb_unanchor_urb(urb);
551+
545552
if (err == -ENODEV) {
546553
for (i = 0; i < dev->net_count; i++) {
547554
if (dev->nets[i])
548555
netif_device_detach(dev->nets[i]->netdev);
549556
}
550-
} else if (err) {
557+
} else {
551558
dev_err(dev->udev->dev.parent,
552559
"failed resubmitting read bulk urb: %pe\n", ERR_PTR(err));
553560
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,14 @@ static void kvaser_usb_read_bulk_callback(struct urb *urb)
361361
urb->transfer_buffer, KVASER_USB_RX_BUFFER_SIZE,
362362
kvaser_usb_read_bulk_callback, dev);
363363

364+
usb_anchor_urb(urb, &dev->rx_submitted);
365+
364366
err = usb_submit_urb(urb, GFP_ATOMIC);
367+
if (!err)
368+
return;
369+
370+
usb_unanchor_urb(urb);
371+
365372
if (err == -ENODEV) {
366373
for (i = 0; i < dev->nchannels; i++) {
367374
struct kvaser_usb_net_priv *priv;
@@ -372,7 +379,7 @@ static void kvaser_usb_read_bulk_callback(struct urb *urb)
372379

373380
netif_device_detach(priv->netdev);
374381
}
375-
} else if (err) {
382+
} else {
376383
dev_err(&dev->intf->dev,
377384
"Failed resubmitting read bulk urb: %d\n", err);
378385
}

drivers/net/can/usb/mcba_usb.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,11 +608,17 @@ static void mcba_usb_read_bulk_callback(struct urb *urb)
608608
urb->transfer_buffer, MCBA_USB_RX_BUFF_SIZE,
609609
mcba_usb_read_bulk_callback, priv);
610610

611+
usb_anchor_urb(urb, &priv->rx_submitted);
612+
611613
retval = usb_submit_urb(urb, GFP_ATOMIC);
614+
if (!retval)
615+
return;
616+
617+
usb_unanchor_urb(urb);
612618

613619
if (retval == -ENODEV)
614620
netif_device_detach(netdev);
615-
else if (retval)
621+
else
616622
netdev_err(netdev, "failed resubmitting read bulk urb: %d\n",
617623
retval);
618624
}

drivers/net/can/usb/usb_8dev.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,11 +541,17 @@ static void usb_8dev_read_bulk_callback(struct urb *urb)
541541
urb->transfer_buffer, RX_BUFFER_SIZE,
542542
usb_8dev_read_bulk_callback, priv);
543543

544+
usb_anchor_urb(urb, &priv->rx_submitted);
545+
544546
retval = usb_submit_urb(urb, GFP_ATOMIC);
547+
if (!retval)
548+
return;
549+
550+
usb_unanchor_urb(urb);
545551

546552
if (retval == -ENODEV)
547553
netif_device_detach(netdev);
548-
else if (retval)
554+
else
549555
netdev_err(netdev,
550556
"failed resubmitting read bulk urb: %d\n", retval);
551557
}

0 commit comments

Comments
 (0)