mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
net: airoha: Fix potential use-after-free in airoha_ppe_deinit()
airoha_ppe_deinit() replaces the NPU pointer with NULL via rcu_replace_pointer() but does not wait for existing RCU readers to exit before calling ppe_deinit() and airoha_npu_put(). This can cause a use-after-free if a reader in an RCU read-side critical section still holds a reference to the NPU when it is freed. The init path (airoha_ppe_init) already calls synchronize_rcu() after rcu_assign_pointer(), but the deinit path introduced in commit6abcf751bc("net: airoha: Fix schedule while atomic in airoha_ppe_deinit()") omitted the matching barrier when switching from rcu_read_lock()/rcu_dereference() to rcu_replace_pointer(). Add synchronize_rcu() before ppe_deinit() to ensure all existing RCU readers have completed before the NPU resources are released. Fixes:6abcf751bc("net: airoha: Fix schedule while atomic in airoha_ppe_deinit()") Signed-off-by: Wayen Yan <win847@gmail.com> Acked-by: Lorenzo Bianconi <lorenzo@kernel.org> Link: https://patch.msgid.link/178351022574.97989.6880403520276841703@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
4c1eabbef7
commit
2484568a33
|
|
@ -1659,6 +1659,7 @@ void airoha_ppe_deinit(struct airoha_eth *eth)
|
|||
npu = rcu_replace_pointer(eth->npu, NULL,
|
||||
lockdep_is_held(&flow_offload_mutex));
|
||||
if (npu) {
|
||||
synchronize_rcu();
|
||||
npu->ops.ppe_deinit(npu);
|
||||
airoha_npu_put(npu);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user