Skip to content

Commit b67d0dd

Browse files
jihochumarckleinebudde
authored andcommitted
can: peak: fix bad memory access and free sequence
Fix for bad memory access while disconnecting. netdev is freed before private data free, and dev is accessed after freeing netdev. This makes a slub problem, and it raise kernel oops with slub debugger config. Signed-off-by: Jiho Chu <[email protected]> Cc: linux-stable <[email protected]> Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent ec988ad commit b67d0dd

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

drivers/net/can/usb/peak_usb/pcan_usb_core.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -870,23 +870,25 @@ static int peak_usb_create_dev(const struct peak_usb_adapter *peak_usb_adapter,
870870
static void peak_usb_disconnect(struct usb_interface *intf)
871871
{
872872
struct peak_usb_device *dev;
873+
struct peak_usb_device *dev_prev_siblings;
873874

874875
/* unregister as many netdev devices as siblings */
875-
for (dev = usb_get_intfdata(intf); dev; dev = dev->prev_siblings) {
876+
for (dev = usb_get_intfdata(intf); dev; dev = dev_prev_siblings) {
876877
struct net_device *netdev = dev->netdev;
877878
char name[IFNAMSIZ];
878879

880+
dev_prev_siblings = dev->prev_siblings;
879881
dev->state &= ~PCAN_USB_STATE_CONNECTED;
880882
strncpy(name, netdev->name, IFNAMSIZ);
881883

882884
unregister_netdev(netdev);
883-
free_candev(netdev);
884885

885886
kfree(dev->cmd_buf);
886887
dev->next_siblings = NULL;
887888
if (dev->adapter->dev_free)
888889
dev->adapter->dev_free(dev);
889890

891+
free_candev(netdev);
890892
dev_info(&intf->dev, "%s removed\n", name);
891893
}
892894

0 commit comments

Comments
 (0)