Commit 3b73a0e4 authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman

USB: usblp: fix use-after-free on disconnect

commit 7a759197 upstream.

A recent commit addressing a runtime PM use-count regression, introduced
a use-after-free by not making sure we held a reference to the struct
usb_interface for the lifetime of the driver data.

Fixes: 9a315358 ("USB: usblp: fix runtime PM after driver unbind")
Cc: stable <stable@vger.kernel.org>
Reported-by: syzbot+cd24df4d075c319ebfc5@syzkaller.appspotmail.com
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Link: https://lore.kernel.org/r/20191015175522.18490-1-johan@kernel.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 28ab2c5f
...@@ -445,6 +445,7 @@ static void usblp_cleanup(struct usblp *usblp) ...@@ -445,6 +445,7 @@ static void usblp_cleanup(struct usblp *usblp)
kfree(usblp->readbuf); kfree(usblp->readbuf);
kfree(usblp->device_id_string); kfree(usblp->device_id_string);
kfree(usblp->statusbuf); kfree(usblp->statusbuf);
usb_put_intf(usblp->intf);
kfree(usblp); kfree(usblp);
} }
...@@ -1107,7 +1108,7 @@ static int usblp_probe(struct usb_interface *intf, ...@@ -1107,7 +1108,7 @@ static int usblp_probe(struct usb_interface *intf,
init_waitqueue_head(&usblp->wwait); init_waitqueue_head(&usblp->wwait);
init_usb_anchor(&usblp->urbs); init_usb_anchor(&usblp->urbs);
usblp->ifnum = intf->cur_altsetting->desc.bInterfaceNumber; usblp->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
usblp->intf = intf; usblp->intf = usb_get_intf(intf);
/* Malloc device ID string buffer to the largest expected length, /* Malloc device ID string buffer to the largest expected length,
* since we can re-query it on an ioctl and a dynamic string * since we can re-query it on an ioctl and a dynamic string
...@@ -1196,6 +1197,7 @@ static int usblp_probe(struct usb_interface *intf, ...@@ -1196,6 +1197,7 @@ static int usblp_probe(struct usb_interface *intf,
kfree(usblp->readbuf); kfree(usblp->readbuf);
kfree(usblp->statusbuf); kfree(usblp->statusbuf);
kfree(usblp->device_id_string); kfree(usblp->device_id_string);
usb_put_intf(usblp->intf);
kfree(usblp); kfree(usblp);
abort_ret: abort_ret:
return retval; return retval;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment