mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
rtc: 88pm860x: prevent use-after-free on device remove
[ Upstream commit f22b1ba15e ]
The device's remove() attempts to shut down the delayed_work scheduled
on the kernel-global workqueue by calling flush_scheduled_work().
Unfortunately, flush_scheduled_work() does not prevent the delayed_work
from re-scheduling itself. The delayed_work might run after the device
has been removed, and touch the already de-allocated info structure.
This is a potential use-after-free.
Fix by calling cancel_delayed_work_sync() during remove(): this ensures
that the delayed work is properly cancelled, is no longer running, and
is not able to re-schedule itself.
This issue was detected with the help of Coccinelle.
Signed-off-by: Sven Van Asbroeck <TheSven73@gmail.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
0ea8b7cf94
commit
7fd0d9d10e
|
|
@ -414,7 +414,7 @@ static int pm860x_rtc_remove(struct platform_device *pdev)
|
|||
struct pm860x_rtc_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
#ifdef VRTC_CALIBRATION
|
||||
flush_scheduled_work();
|
||||
cancel_delayed_work_sync(&info->calib_work);
|
||||
/* disable measurement */
|
||||
pm860x_set_bits(info->i2c, PM8607_MEAS_EN2, MEAS2_VRTC, 0);
|
||||
#endif /* VRTC_CALIBRATION */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user