mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
wifi: brcmsmac: fix UAF in brcms_free_timer()
brcms_free_timer() calls brcms_del_timer() which uses the non-synchronous
cancel_delayed_work() to cancel the timer's underlying delayed work. If
the work callback (_brcms_timer) is already running, cancel_delayed_work()
returns false without waiting, and brcms_free_timer() proceeds to kfree(t)
while the callback still accesses t through container_of().
Add an explicit cancel_delayed_work_sync() after brcms_del_timer() to
guarantee that any in-flight callback has completed before the timer
structure is freed.
Fixes: 5b435de0d7 ("net: wireless: add brcm80211 drivers")
Cc: stable@vger.kernel.org
Signed-off-by: Jiangshan Yi <yijiangshan@kylinos.cn>
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Link: https://patch.msgid.link/20260815121043.938414-1-yijiangshan@kylinos.cn
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
621d90169c
commit
1eeca1d5e0
|
|
@ -1571,6 +1571,10 @@ void brcms_free_timer(struct brcms_timer *t)
|
|||
|
||||
/* delete the timer in case it is active */
|
||||
brcms_del_timer(t);
|
||||
/* Ensure the callback has finished before freeing the timer
|
||||
* structure, since brcms_del_timer() uses non-synchronous cancel.
|
||||
*/
|
||||
cancel_delayed_work_sync(&t->dly_wrk);
|
||||
|
||||
if (wl->timers == t) {
|
||||
wl->timers = wl->timers->next;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user