]> www.infradead.org Git - users/willy/xarray.git/commitdiff
watchdog: Fix possible use-after-free by calling del_timer_sync()
authorZou Wei <zou_wei@huawei.com>
Wed, 12 May 2021 06:57:56 +0000 (14:57 +0800)
committerWim Van Sebroeck <wim@linux-watchdog.org>
Mon, 21 Jun 2021 06:49:03 +0000 (08:49 +0200)
This driver's remove path calls del_timer(). However, that function
does not wait until the timer handler finishes. This means that the
timer handler may still be running after the driver's remove function
has finished, which would result in a use-after-free.

Fix by calling del_timer_sync(), which makes sure the timer handler
has finished, and unable to re-schedule itself.

Reported-by: Hulk Robot <hulkci@huawei.com>
Signed-off-by: Zou Wei <zou_wei@huawei.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Acked-by: Vladimir Zapolskiy <vz@mleia.com>
Link: https://lore.kernel.org/r/1620802676-19701-1-git-send-email-zou_wei@huawei.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
drivers/watchdog/lpc18xx_wdt.c
drivers/watchdog/w83877f_wdt.c

index 78cf11c949416786a3ca295a44d164e0b0ca7541..60b6d74f267dd67dbd89b5346f9711295c2e93c7 100644 (file)
@@ -292,7 +292,7 @@ static int lpc18xx_wdt_remove(struct platform_device *pdev)
        struct lpc18xx_wdt_dev *lpc18xx_wdt = platform_get_drvdata(pdev);
 
        dev_warn(&pdev->dev, "I quit now, hardware will probably reboot!\n");
-       del_timer(&lpc18xx_wdt->timer);
+       del_timer_sync(&lpc18xx_wdt->timer);
 
        return 0;
 }
index 5772cc5d378041ac42c2f924b777990b0f4429d9..f2650863fd0272bd4ce9f92cfe3e8c35579d7e57 100644 (file)
@@ -166,7 +166,7 @@ static void wdt_startup(void)
 static void wdt_turnoff(void)
 {
        /* Stop the timer */
-       del_timer(&timer);
+       del_timer_sync(&timer);
 
        wdt_change(WDT_DISABLE);