]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ACPI: video: Fix use-after-free in acpi_video_switch_brightness()
authorYuhao Jiang <danisjiang@gmail.com>
Wed, 22 Oct 2025 20:07:04 +0000 (15:07 -0500)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 23 Oct 2025 18:36:55 +0000 (20:36 +0200)
The switch_brightness_work delayed work accesses device->brightness
and device->backlight, freed by acpi_video_dev_unregister_backlight()
during device removal.

If the work executes after acpi_video_bus_unregister_backlight()
frees these resources, it causes a use-after-free when
acpi_video_switch_brightness() dereferences device->brightness or
device->backlight.

Fix this by calling cancel_delayed_work_sync() for each device's
switch_brightness_work in acpi_video_bus_remove_notify_handler()
after removing the notify handler that queues the work. This ensures
the work completes before the memory is freed.

Fixes: 8ab58e8e7e097 ("ACPI / video: Fix backlight taking 2 steps on a brightness up/down keypress")
Cc: All applicable <stable@vger.kernel.org>
Signed-off-by: Yuhao Jiang <danisjiang@gmail.com>
Reviewed-by: Hans de Goede <hansg@kernel.org>
[ rjw: Changelog edit ]
Link: https://patch.msgid.link/20251022200704.2655507-1-danisjiang@gmail.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpi_video.c

index 103f296615762d653888c98a2d3974cc43a733e6..be8e7e18abcab726cb6b06e856df2119ead3b46f 100644 (file)
@@ -1959,8 +1959,10 @@ static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video)
        struct acpi_video_device *dev;
 
        mutex_lock(&video->device_list_lock);
-       list_for_each_entry(dev, &video->video_device_list, entry)
+       list_for_each_entry(dev, &video->video_device_list, entry) {
                acpi_video_dev_remove_notify_handler(dev);
+               cancel_delayed_work_sync(&dev->switch_brightness_work);
+       }
        mutex_unlock(&video->device_list_lock);
 
        acpi_video_bus_stop_devices(video);