Thread (4 messages) flat view 4 messages, 3 authors, 5d ago

Re: [PATCH net] net/sched: reject IDR error pointers when deleting actions

From: Jamal Hadi Salim <jhs@mojatatu.com>
Date: 2026-09-14 09:58:44
Also in: lkml

On Mon, Sep 14, 2026 at 2:51 AM Weiming Shi [off-list ref] wrote:
tcf_action_delete() drops the reference held by its lookup before calling
tcf_idr_delete_index() with the saved action index.  An unlocked
classifier can remove that action and reserve the same IDR slot with
ERR_PTR(-EBUSY) in between.

tcf_idr_delete_index() only checks the lookup result for NULL.  It
therefore treats the reservation as a tc_action and dereferences
tcfa_bindcnt.  A hardware execution breakpoint was used to schedule the
interleaving without changing the kernel source.  KASAN reported this
decoded trace:

  BUG: KASAN: null-ptr-deref in tca_action_gd+0x5b9/0x1010
  Read of size 4 at addr 0000000000000010 by task poc/150
  Oops: general protection fault, probably for non-canonical address 0xdffffc0000000002
  RIP: tca_action_gd+0x5c0/0x1010:
    arch_atomic_read at arch/x86/include/asm/atomic.h:23
    raw_atomic_read at include/linux/atomic/atomic-arch-fallback.h:457
    atomic_read at include/linux/atomic/atomic-instrumented.h:33
    tcf_idr_delete_index at net/sched/act_api.c:766
    tcf_action_delete at net/sched/act_api.c:1859
    tcf_del_notify at net/sched/act_api.c:2014
    tca_action_gd at net/sched/act_api.c:2064
  R13: 0000000000000010 R15: fffffffffffffff0
  Kernel panic - not syncing: Fatal exception

R15 contains ERR_PTR(-EBUSY), and adding the tcfa_bindcnt offset produces
the address in R13.  With the guard applied, the same reproducer returned
-ENOENT without a KASAN report or panic.  Treat error pointers as absent
and return -ENOENT.
We test all submissions to tc. Can you provide a tdc test or reproducer (PoC)?
Please remember tto do his for any future submissions. If the
information is sensitive, please send it to me privately.

cheer,
jamal

quoted hunk ↗ jump to hunk
Fixes: 0190c1d452a9 ("net: sched: atomically check-allocate action")
Cc: stable@vger.kernel.org
Reported-by: Xiang Mei <redacted>
Assisted-by: LLM
Signed-off-by: Weiming Shi <redacted>
---
 net/sched/act_api.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index 19501dc99..eabe612b7 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -758,7 +758,7 @@ static int tcf_idr_delete_index(struct tcf_idrinfo *idrinfo, u32 index)

        mutex_lock(&idrinfo->lock);
        p = idr_find(&idrinfo->action_idr, index);
-       if (!p) {
+       if (IS_ERR_OR_NULL(p)) {
                mutex_unlock(&idrinfo->lock);
                return -ENOENT;
        }
base-commit: e6b6078ea1731b05b3b552497b3bce4bf8b014ae
--
2.55.0
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help