[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20260211082024.1967588-1-d.dulov@aladdin.ru>
Date: Wed, 11 Feb 2026 11:20:24 +0300
From: Daniil Dulov <d.dulov@...ddin.ru>
To: Johannes Berg <johannes@...solutions.net>
CC: Daniil Dulov <d.dulov@...ddin.ru>, <linux-wireless@...r.kernel.org>,
<linux-kernel@...r.kernel.org>, <lvc-project@...uxtesting.org>,
<stable@...r.kernel.org>
Subject: [PATCH v2] wifi: cfg80211: cancel rfkill_block work in wiphy_unregister()
There is a use-after-free error in cfg80211_shutdown_all_interfaces found
by syzkaller:
BUG: KASAN: use-after-free in cfg80211_shutdown_all_interfaces+0x213/0x220
Read of size 8 at addr ffff888112a78d98 by task kworker/0:5/5326
CPU: 0 UID: 0 PID: 5326 Comm: kworker/0:5 Not tainted 6.19.0-rc2 #2 PREEMPT(voluntary)
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014
Workqueue: events cfg80211_rfkill_block_work
Call Trace:
<TASK>
dump_stack_lvl+0x116/0x1f0
print_report+0xcd/0x630
kasan_report+0xe0/0x110
cfg80211_shutdown_all_interfaces+0x213/0x220
cfg80211_rfkill_block_work+0x1e/0x30
process_one_work+0x9cf/0x1b70
worker_thread+0x6c8/0xf10
kthread+0x3c5/0x780
ret_from_fork+0x56d/0x700
ret_from_fork_asm+0x1a/0x30
</TASK>
The problem arises due to the rfkill_block work is not cancelled when wiphy
is being unregistered. In order to fix the issue cancel the corresponding
work in wiphy_unregister().
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
Fixes: 1f87f7d3a3b4 ("cfg80211: add rfkill support")
Cc: stable@...r.kernel.org
Signed-off-by: Daniil Dulov <d.dulov@...ddin.ru>
---
v2: move cancel_work_sync() from cfg80211_dev_free() to wiphy_unregister()
as suggested by Johannes Berg <johannes@...solutions.net>
net/wireless/core.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/net/wireless/core.c b/net/wireless/core.c
index 9a420d627d3c..8628e0eefadc 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -1214,6 +1214,7 @@ void wiphy_unregister(struct wiphy *wiphy)
/* this has nothing to do now but make sure it's gone */
cancel_work_sync(&rdev->wiphy_work);
+ cancel_work_sync(&rdev->rfkill_block);
cancel_work_sync(&rdev->conn_work);
flush_work(&rdev->event_work);
cancel_delayed_work_sync(&rdev->dfs_update_channels_wk);
--
2.34.1
Powered by blists - more mailing lists