Skip to content

Commit d158f5e

Browse files
rpthibeaultUlrich Hecht
authored andcommitted
Bluetooth: btusb: reorder cleanup in btusb_disconnect to avoid UAF
[ Upstream commit 23d22f2f71768034d6ef86168213843fc49bf550 ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org> [uli: backport to 4.19] Signed-off-by: Ulrich Hecht <uli@kernel.org> Reviewed-by: Pavel Machek <pavel@nabladev.com>
1 parent 99880fb commit d158f5e

1 file changed

Lines changed: 4 additions & 4 deletions

File tree

drivers/bluetooth/btusb.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3268,6 +3268,9 @@ static void btusb_disconnect(struct usb_interface *intf)
32683268

32693269
hci_unregister_dev(hdev);
32703270

3271+
if (data->oob_wake_irq)
3272+
device_init_wakeup(&data->udev->dev, false);
3273+
32713274
if (intf == data->intf) {
32723275
if (data->isoc)
32733276
usb_driver_release_interface(&btusb_driver, data->isoc);
@@ -3278,14 +3281,11 @@ static void btusb_disconnect(struct usb_interface *intf)
32783281
usb_driver_release_interface(&btusb_driver, data->diag);
32793282
usb_driver_release_interface(&btusb_driver, data->intf);
32803283
} else if (intf == data->diag) {
3281-
usb_driver_release_interface(&btusb_driver, data->intf);
32823284
if (data->isoc)
32833285
usb_driver_release_interface(&btusb_driver, data->isoc);
3286+
usb_driver_release_interface(&btusb_driver, data->intf);
32843287
}
32853288

3286-
if (data->oob_wake_irq)
3287-
device_init_wakeup(&data->udev->dev, false);
3288-
32893289
hci_free_dev(hdev);
32903290
}
32913291

0 commit comments

Comments
 (0)