Skip to content

Commit e29949e

Browse files
jihochugregkh
authored andcommitted
can: peak: fix bad memory access and free sequence
commit b67d0dd7d0dc9e456825447bbeb935d8ef43ea7c upstream. 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 <jiho.chu@samsung.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 083021b commit e29949e

1 file changed

Lines changed: 4 additions & 2 deletions

File tree

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -872,23 +872,25 @@ static int peak_usb_create_dev(const struct peak_usb_adapter *peak_usb_adapter,
872872
static void peak_usb_disconnect(struct usb_interface *intf)
873873
{
874874
struct peak_usb_device *dev;
875+
struct peak_usb_device *dev_prev_siblings;
875876

876877
/* unregister as many netdev devices as siblings */
877-
for (dev = usb_get_intfdata(intf); dev; dev = dev->prev_siblings) {
878+
for (dev = usb_get_intfdata(intf); dev; dev = dev_prev_siblings) {
878879
struct net_device *netdev = dev->netdev;
879880
char name[IFNAMSIZ];
880881

882+
dev_prev_siblings = dev->prev_siblings;
881883
dev->state &= ~PCAN_USB_STATE_CONNECTED;
882884
strncpy(name, netdev->name, IFNAMSIZ);
883885

884886
unregister_netdev(netdev);
885-
free_candev(netdev);
886887

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

893+
free_candev(netdev);
892894
dev_info(&intf->dev, "%s removed\n", name);
893895
}
894896

0 commit comments

Comments
 (0)