Skip to content

Commit 646190f

Browse files
miaoqing-quicmehmetb0
authored andcommitted
wifi: ath12k: fix uaf in ath12k_core_init()
BugLink: https://bugs.launchpad.net/bugs/2119603 [ Upstream commit f3fe49dbddd73f0155a8935af47cb63693069dbe ] When the execution of ath12k_core_hw_group_assign() or ath12k_core_hw_group_create() fails, the registered notifier chain is not unregistered properly. Its memory is freed after rmmod, which may trigger to a use-after-free (UAF) issue if there is a subsequent access to this notifier chain. Fixes the issue by calling ath12k_core_panic_notifier_unregister() in failure cases. Call trace: notifier_chain_register+0x4c/0x1f0 (P) atomic_notifier_chain_register+0x38/0x68 ath12k_core_init+0x50/0x4e8 [ath12k] ath12k_pci_probe+0x5f8/0xc28 [ath12k] pci_device_probe+0xbc/0x1a8 really_probe+0xc8/0x3a0 __driver_probe_device+0x84/0x1b0 driver_probe_device+0x44/0x130 __driver_attach+0xcc/0x208 bus_for_each_dev+0x84/0x100 driver_attach+0x2c/0x40 bus_add_driver+0x130/0x260 driver_register+0x70/0x138 __pci_register_driver+0x68/0x80 ath12k_pci_init+0x30/0x68 [ath12k] ath12k_init+0x28/0x78 [ath12k] Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Fixes: 6f245ea ("wifi: ath12k: introduce device group abstraction") Signed-off-by: Miaoqing Pan <miaoqing.pan@oss.qualcomm.com> Reviewed-by: Baochen Qiang <quic_bqiang@quicinc.com> Link: https://patch.msgid.link/20250604055250.1228501-1-miaoqing.pan@oss.qualcomm.com Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com> Signed-off-by: Sasha Levin <sashal@kernel.org> CVE-2025-38116 Signed-off-by: Manuel Diewald <manuel.diewald@canonical.com> Signed-off-by: Mehmet Basaran <mehmet.basaran@canonical.com>
1 parent 1d85fa4 commit 646190f

File tree

1 file changed

+7
-3
lines changed
  • drivers/net/wireless/ath/ath12k

1 file changed

+7
-3
lines changed

drivers/net/wireless/ath/ath12k/core.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1889,7 +1889,8 @@ int ath12k_core_init(struct ath12k_base *ab)
18891889
if (!ag) {
18901890
mutex_unlock(&ath12k_hw_group_mutex);
18911891
ath12k_warn(ab, "unable to get hw group\n");
1892-
return -ENODEV;
1892+
ret = -ENODEV;
1893+
goto err_unregister_notifier;
18931894
}
18941895

18951896
mutex_unlock(&ath12k_hw_group_mutex);
@@ -1904,17 +1905,20 @@ int ath12k_core_init(struct ath12k_base *ab)
19041905
if (ret) {
19051906
mutex_unlock(&ag->mutex);
19061907
ath12k_warn(ab, "unable to create hw group\n");
1907-
goto err;
1908+
goto err_destroy_hw_group;
19081909
}
19091910
}
19101911

19111912
mutex_unlock(&ag->mutex);
19121913

19131914
return 0;
19141915

1915-
err:
1916+
err_destroy_hw_group:
19161917
ath12k_core_hw_group_destroy(ab->ag);
19171918
ath12k_core_hw_group_unassign(ab);
1919+
err_unregister_notifier:
1920+
ath12k_core_panic_notifier_unregister(ab);
1921+
19181922
return ret;
19191923
}
19201924

0 commit comments

Comments
 (0)