]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: btusb: reorder cleanup in btusb_disconnect to avoid UAF
authorRaphael Pinsonneault-Thibeault <rpthibeault@gmail.com>
Wed, 5 Nov 2025 19:28:41 +0000 (14:28 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Dec 2025 11:45:16 +0000 (12:45 +0100)
[ 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: fd913ef7ce619 ("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>
drivers/bluetooth/btusb.c

index 9f71f9135f9e3952e0430c480e475327f8922583..3d79637a56cc49be90af0cc105b503a3d61e633f 100644 (file)
@@ -4004,6 +4004,11 @@ static void btusb_disconnect(struct usb_interface *intf)
 
        hci_unregister_dev(hdev);
 
+       if (data->oob_wake_irq)
+               device_init_wakeup(&data->udev->dev, false);
+       if (data->reset_gpio)
+               gpiod_put(data->reset_gpio);
+
        if (intf == data->intf) {
                if (data->isoc)
                        usb_driver_release_interface(&btusb_driver, data->isoc);
@@ -4014,17 +4019,11 @@ static void btusb_disconnect(struct usb_interface *intf)
                        usb_driver_release_interface(&btusb_driver, data->diag);
                usb_driver_release_interface(&btusb_driver, data->intf);
        } else if (intf == data->diag) {
-               usb_driver_release_interface(&btusb_driver, data->intf);
                if (data->isoc)
                        usb_driver_release_interface(&btusb_driver, data->isoc);
+               usb_driver_release_interface(&btusb_driver, data->intf);
        }
 
-       if (data->oob_wake_irq)
-               device_init_wakeup(&data->udev->dev, false);
-
-       if (data->reset_gpio)
-               gpiod_put(data->reset_gpio);
-
        hci_free_dev(hdev);
 }