| From f819e5d18582ca0a7a42781d9be3fa69e5a64b73 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 15 Oct 2021 12:03:35 +0800 |
| Subject: rsi: stop thread firstly in rsi_91x_init() error handling |
| |
| From: Ziyang Xuan <william.xuanziyang@huawei.com> |
| |
| [ Upstream commit 515e7184bdf0a3ebf1757cc77fb046b4fe282189 ] |
| |
| When fail to init coex module, free 'common' and 'adapter' directly, but |
| common->tx_thread which will access 'common' and 'adapter' is running at |
| the same time. That will trigger the UAF bug. |
| |
| ================================================================== |
| BUG: KASAN: use-after-free in rsi_tx_scheduler_thread+0x50f/0x520 [rsi_91x] |
| Read of size 8 at addr ffff8880076dc000 by task Tx-Thread/124777 |
| CPU: 0 PID: 124777 Comm: Tx-Thread Not tainted 5.15.0-rc5+ #19 |
| Call Trace: |
| dump_stack_lvl+0xe2/0x152 |
| print_address_description.constprop.0+0x21/0x140 |
| ? rsi_tx_scheduler_thread+0x50f/0x520 |
| kasan_report.cold+0x7f/0x11b |
| ? rsi_tx_scheduler_thread+0x50f/0x520 |
| rsi_tx_scheduler_thread+0x50f/0x520 |
| ... |
| |
| Freed by task 111873: |
| kasan_save_stack+0x1b/0x40 |
| kasan_set_track+0x1c/0x30 |
| kasan_set_free_info+0x20/0x30 |
| __kasan_slab_free+0x109/0x140 |
| kfree+0x117/0x4c0 |
| rsi_91x_init+0x741/0x8a0 [rsi_91x] |
| rsi_probe+0x9f/0x1750 [rsi_usb] |
| |
| Stop thread before free 'common' and 'adapter' to fix it. |
| |
| Fixes: 2108df3c4b18 ("rsi: add coex support") |
| Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com> |
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> |
| Link: https://lore.kernel.org/r/20211015040335.1021546-1-william.xuanziyang@huawei.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/wireless/rsi/rsi_91x_main.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c b/drivers/net/wireless/rsi/rsi_91x_main.c |
| index aece1d3a6b055..441fda71f6289 100644 |
| --- a/drivers/net/wireless/rsi/rsi_91x_main.c |
| +++ b/drivers/net/wireless/rsi/rsi_91x_main.c |
| @@ -368,6 +368,7 @@ struct rsi_hw *rsi_91x_init(u16 oper_mode) |
| if (common->coex_mode > 1) { |
| if (rsi_coex_attach(common)) { |
| rsi_dbg(ERR_ZONE, "Failed to init coex module\n"); |
| + rsi_kill_thread(&common->tx_thread); |
| goto err; |
| } |
| } |
| -- |
| 2.33.0 |
| |