Input: cyttsp4_core - change del_timer_sync() to timer_shutdown_sync()
Subsystems (3)
PATCH 1/1 Input: cyttsp4_core - change del_timer_sync() to timer_shutdown_sync()
The watchdog_timer can schedule tx_timeout_task and watchdog_work can also arm watchdog_timer. The process is shown below:
----------- timer schedules work ------------cyttsp4_watchdog_timer() //timer handler
schedule_work(&cd->watchdog_work)
----------- work arms timer ------------ cyttsp4_watchdog_work() //workqueue callback function
cyttsp4_start_wd_timer()
mod_timer(&cd->watchdog_timer, ...)
Although del_timer_sync() and cancel_work_sync() are called in cyttsp4_remove(), the timer and workqueue could still be rearmed. As a result, the possible use after free bugs could happen. The process is shown below:
(cleanup routine) | (timer and workqueue routine)
cyttsp4_remove() | cyttsp4_watchdog_timer() //timer
cyttsp4_stop_wd_timer() | schedule_work()
del_timer_sync() |
| cyttsp4_watchdog_work() //worker
| cyttsp4_start_wd_timer()
| mod_timer()
cancel_work_sync() |
| cyttsp4_watchdog_timer() //timer
| schedule_work()
del_timer_sync() |
kfree(cd) //FREE |
| cyttsp4_watchdog_work() // reschedule!
| cd-> //USEThis patch changes del_timer_sync() to timer_shutdown_sync(), which could prevent rearming of the timer from the workqueue.
--- drivers/input/touchscreen/cyttsp4_core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/input/touchscreen/cyttsp4_core.c +1 -2
@@ -1263,9 +1263,8 @@ static void cyttsp4_stop_wd_timer(struct cyttsp4 *cd)* Ensure we wait until the watchdog timer * running on a different CPU finishes */ -del_timer_sync (&cd->watchdog_timer); +timer_shutdown_sync (&cd->watchdog_timer);cancel_work_sync (&cd->watchdog_work); -del_timer_sync (&cd->watchdog_timer); }static void cyttsp4_watchdog_timer (struct timer_list *t)
Signature · 1 line
2.17.1
Quoted 32 lines · Duoming Zhou
The
watchdog_timercan scheduletx_timeout_taskandwatchdog_workcan also armwatchdog_timer. The process is shown below:----------- timer schedules work ------------
cyttsp4_watchdog_timer()//timer handler
schedule_work(&cd->watchdog_work)----------- work arms timer ------------
cyttsp4_watchdog_work()//workqueue callback function
cyttsp4_start_wd_timer()mod_timer(&cd->watchdog_timer, ...)Although
del_timer_sync()andcancel_work_sync()are called incyttsp4_remove(), the timer and workqueue could still be rearmed. As a result, the possible use after free bugs could happen. The process is shown below:(cleanup routine) | (timer and workqueue routine) cyttsp4_remove() | cyttsp4_watchdog_timer() //timer cyttsp4_stop_wd_timer() | schedule_work() del_timer_sync() | | cyttsp4_watchdog_work() //worker | cyttsp4_start_wd_timer() | mod_timer() cancel_work_sync() | | cyttsp4_watchdog_timer() //timer | schedule_work() del_timer_sync() | kfree(cd) //FREE | | cyttsp4_watchdog_work() // reschedule! | cd-> //USE
Quoted 5 lines
This patch changes
del_timer_sync()totimer_shutdown_sync(), which could prevent rearming of the timer from the workqueue.Fixes 17fb1563d69b ("Input: cyttsp4 - add core driver for Cypress TMA4XX touchscreen devices")Signed-off-by Duoming Zhou <[email protected]>
Applied, thank you.
Signature · 1 line
Dmitry