Skip to content

Commit f3fe49d

Browse files
miaoqing-quicJeff Johnson
authored andcommitted
wifi: ath12k: fix uaf in ath12k_core_init()
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 <[email protected]> Reviewed-by: Baochen Qiang <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jeff Johnson <[email protected]>
1 parent b6bca6d commit f3fe49d

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
@@ -2129,7 +2129,8 @@ int ath12k_core_init(struct ath12k_base *ab)
21292129
if (!ag) {
21302130
mutex_unlock(&ath12k_hw_group_mutex);
21312131
ath12k_warn(ab, "unable to get hw group\n");
2132-
return -ENODEV;
2132+
ret = -ENODEV;
2133+
goto err_unregister_notifier;
21332134
}
21342135

21352136
mutex_unlock(&ath12k_hw_group_mutex);
@@ -2144,17 +2145,20 @@ int ath12k_core_init(struct ath12k_base *ab)
21442145
if (ret) {
21452146
mutex_unlock(&ag->mutex);
21462147
ath12k_warn(ab, "unable to create hw group\n");
2147-
goto err;
2148+
goto err_destroy_hw_group;
21482149
}
21492150
}
21502151

21512152
mutex_unlock(&ag->mutex);
21522153

21532154
return 0;
21542155

2155-
err:
2156+
err_destroy_hw_group:
21562157
ath12k_core_hw_group_destroy(ab->ag);
21572158
ath12k_core_hw_group_unassign(ab);
2159+
err_unregister_notifier:
2160+
ath12k_core_panic_notifier_unregister(ab);
2161+
21582162
return ret;
21592163
}
21602164

0 commit comments

Comments
 (0)