V4L/DVB (7320): pvrusb2: Eliminate timer race during tear-down
The pvrusb2 tear-down logic was clearing two timers before stopping its internal work queue. That left a tiny window open where the work queue might run after the timers are stopped, possibly starting them again. This could lead to dangling pointers and an oops. Solution: Kill the work queue first, then delete the timers. Signed-off-by: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
c4a8828ddb
commit
8f59100a42
1 changed files with 2 additions and 2 deletions
|
@ -2114,13 +2114,13 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
|
|||
{
|
||||
if (!hdw) return;
|
||||
pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw);
|
||||
del_timer_sync(&hdw->quiescent_timer);
|
||||
del_timer_sync(&hdw->encoder_wait_timer);
|
||||
if (hdw->workqueue) {
|
||||
flush_workqueue(hdw->workqueue);
|
||||
destroy_workqueue(hdw->workqueue);
|
||||
hdw->workqueue = NULL;
|
||||
}
|
||||
del_timer_sync(&hdw->quiescent_timer);
|
||||
del_timer_sync(&hdw->encoder_wait_timer);
|
||||
if (hdw->fw_buffer) {
|
||||
kfree(hdw->fw_buffer);
|
||||
hdw->fw_buffer = NULL;
|
||||
|
|
Loading…
Add table
Reference in a new issue