]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: airoha: Fix potential use-after-free in airoha_ppe_deinit()
authorWayen Yan <win847@gmail.com>
Wed, 8 Jul 2026 11:16:16 +0000 (19:16 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 21 Jul 2026 10:17:54 +0000 (12:17 +0200)
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
commit 6abcf751bc08 ("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: 6abcf751bc084804a9e5b3051442e8a2ce67f48a ("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>
drivers/net/ethernet/airoha/airoha_ppe.c

index e7c78293002abb162cc6052b7a62d6c2836b8482..f6396925722d028ec3772648a95a1800c87fc76a 100644 (file)
@@ -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);
        }