Skip to content

Commit 23d22f2

Browse files
rpthibeaultVudentz
authored andcommitted
Bluetooth: btusb: reorder cleanup in btusb_disconnect to avoid UAF
There is a KASAN: slab-use-after-free read in btusb_disconnect(). Calling "usb_driver_release_interface(&btusb_driver, data->intf)" will free the btusb data associated with the interface. The same data is then used later in the function, hence the UAF. Fix by moving the accesses to btusb data to before the data is free'd. Reported-by: syzbot+2fc81b50a4f8263a159b@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=2fc81b50a4f8263a159b Tested-by: syzbot+2fc81b50a4f8263a159b@syzkaller.appspotmail.com Fixes: fd913ef ("Bluetooth: btusb: Add out-of-band wakeup support") Signed-off-by: Raphael Pinsonneault-Thibeault <rpthibeault@gmail.com> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
1 parent 55fb52f commit 23d22f2

1 file changed

Lines changed: 6 additions & 7 deletions

File tree

drivers/bluetooth/btusb.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4361,6 +4361,11 @@ static void btusb_disconnect(struct usb_interface *intf)
43614361

43624362
hci_unregister_dev(hdev);
43634363

4364+
if (data->oob_wake_irq)
4365+
device_init_wakeup(&data->udev->dev, false);
4366+
if (data->reset_gpio)
4367+
gpiod_put(data->reset_gpio);
4368+
43644369
if (intf == data->intf) {
43654370
if (data->isoc)
43664371
usb_driver_release_interface(&btusb_driver, data->isoc);
@@ -4371,17 +4376,11 @@ static void btusb_disconnect(struct usb_interface *intf)
43714376
usb_driver_release_interface(&btusb_driver, data->diag);
43724377
usb_driver_release_interface(&btusb_driver, data->intf);
43734378
} else if (intf == data->diag) {
4374-
usb_driver_release_interface(&btusb_driver, data->intf);
43754379
if (data->isoc)
43764380
usb_driver_release_interface(&btusb_driver, data->isoc);
4381+
usb_driver_release_interface(&btusb_driver, data->intf);
43774382
}
43784383

4379-
if (data->oob_wake_irq)
4380-
device_init_wakeup(&data->udev->dev, false);
4381-
4382-
if (data->reset_gpio)
4383-
gpiod_put(data->reset_gpio);
4384-
43854384
hci_free_dev(hdev);
43864385
}
43874386

0 commit comments

Comments
 (0)