mirror of
https://github.com/torvalds/linux.git
synced 2026-06-09 07:03:37 +02:00
can: peak: fix bad memory access and free sequence
commit b67d0dd7d0 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>
This commit is contained in:
parent
083021bdba
commit
e29949ed39
|
|
@ -872,23 +872,25 @@ static int peak_usb_create_dev(const struct peak_usb_adapter *peak_usb_adapter,
|
|||
static void peak_usb_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct peak_usb_device *dev;
|
||||
struct peak_usb_device *dev_prev_siblings;
|
||||
|
||||
/* unregister as many netdev devices as siblings */
|
||||
for (dev = usb_get_intfdata(intf); dev; dev = dev->prev_siblings) {
|
||||
for (dev = usb_get_intfdata(intf); dev; dev = dev_prev_siblings) {
|
||||
struct net_device *netdev = dev->netdev;
|
||||
char name[IFNAMSIZ];
|
||||
|
||||
dev_prev_siblings = dev->prev_siblings;
|
||||
dev->state &= ~PCAN_USB_STATE_CONNECTED;
|
||||
strncpy(name, netdev->name, IFNAMSIZ);
|
||||
|
||||
unregister_netdev(netdev);
|
||||
free_candev(netdev);
|
||||
|
||||
kfree(dev->cmd_buf);
|
||||
dev->next_siblings = NULL;
|
||||
if (dev->adapter->dev_free)
|
||||
dev->adapter->dev_free(dev);
|
||||
|
||||
free_candev(netdev);
|
||||
dev_info(&intf->dev, "%s removed\n", name);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user