]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Mar 2025 12:02:06 +0000 (13:02 +0100)
[ Upstream commit e53fc232a65f7488ab75d03a5b95f06aaada7262 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/hid/hid-steam.c

index 7b3596689878544ec0f6c37cd38e2fea9f05c34e..19b7bb0c3d7f9941b903cb2b71c0b203964d2b2a 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) {