Skip to content

Commit bd729f9

Browse files
AlanSterngregkh
authored andcommitted
USB: fix error handling in usb_driver_claim_interface()
The syzbot fuzzing project found a use-after-free bug in the USB core. The bug was caused by usbfs not unbinding from an interface when the USB device file was closed, which led another process to attempt the unbind later on, after the private data structure had been deallocated. The reason usbfs did not unbind the interface at the appropriate time was because it thought the interface had never been claimed in the first place. This was caused by the fact that usb_driver_claim_interface() does not clean up properly when device_bind_driver() returns an error. Although the error code gets passed back to the caller, the iface->dev.driver pointer remains set and iface->condition remains equal to USB_INTERFACE_BOUND. This patch adds proper error handling to usb_driver_claim_interface(). Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Reported-by: syzbot+f84aa7209ccec829536f@syzkaller.appspotmail.com CC: <stable@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent c183813 commit bd729f9

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

drivers/usb/core/driver.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,21 @@ int usb_driver_claim_interface(struct usb_driver *driver,
550550
if (device_is_registered(dev))
551551
retval = device_bind_driver(dev);
552552

553+
if (retval) {
554+
dev->driver = NULL;
555+
usb_set_intfdata(iface, NULL);
556+
iface->needs_remote_wakeup = 0;
557+
iface->condition = USB_INTERFACE_UNBOUND;
558+
559+
/*
560+
* Unbound interfaces are always runtime-PM-disabled
561+
* and runtime-PM-suspended
562+
*/
563+
if (driver->supports_autosuspend)
564+
pm_runtime_disable(dev);
565+
pm_runtime_set_suspended(dev);
566+
}
567+
553568
return retval;
554569
}
555570
EXPORT_SYMBOL_GPL(usb_driver_claim_interface);

0 commit comments

Comments
 (0)