HID: hid-steam: Fix use-after-free when detaching device
authorVicki Pfau <vi@endrift.com>
Thu, 27 Feb 2025 23:41:33 +0000 (15:41 -0800)
committerJiri Kosina <jkosina@suse.com>
Tue, 4 Mar 2025 20:46:12 +0000 (21:46 +0100)
When a hid-steam device is removed it must clean up the client_hdev used for
intercepting hidraw access. This can lead to scheduling deferred work to
reattach the input device. Though the cleanup cancels the deferred work, this
was done before the client_hdev itself is cleaned up, so it gets rescheduled.
This patch fixes the ordering to make sure the deferred work is properly
canceled.

Reported-by: syzbot+0154da2d403396b2bd59@syzkaller.appspotmail.com
Fixes: 79504249d7e2 ("HID: hid-steam: Move hidraw input (un)registering to work")
Signed-off-by: Vicki Pfau <vi@endrift.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/hid-steam.c

index c9e65e9088b312514f58912323724c617081210e..10460b7bde1a279c34f3bf861be8e0428cd62f7e 100644 (file)
@@ -1327,11 +1327,11 @@ static void steam_remove(struct hid_device *hdev)
                return;
        }
 
+       hid_destroy_device(steam->client_hdev);
        cancel_delayed_work_sync(&steam->mode_switch);
        cancel_work_sync(&steam->work_connect);
        cancel_work_sync(&steam->rumble_work);
        cancel_work_sync(&steam->unregister_work);
-       hid_destroy_device(steam->client_hdev);
        steam->client_hdev = NULL;
        steam->client_opened = 0;
        if (steam->quirks & STEAM_QUIRK_WIRELESS) {