CVE-2026-98811

Updated on 18 Oct 2026

Severity

2.5 Low severity

Details

CVSS score
2.5

Overview

About vulnerability

In the Linux kernel, the following vulnerability has been resolved:

net/sched: cls_api: reclaim an empty proto on the error path

Two racing tc filter add requests on the same chain/prio of an unlocked classifier both run change() on the shared proto and both can fail: the winner’s tcf_chain_tp_delete_empty() attempt gives up because the loser’s handle is still in the idr, and the loser’s error path drops only its own reference without a second reclamation attempt. The empty proto stays linked in the chain, holding the chain reference, a block reference and the classifier module reference until the chain or block is torn down.

Reclaim the proto on the error path of any failed request that holds a proto reference. The reclamation is emptiness-gated: tcf_chain_tp_delete_empty() unlinks the proto only when delete_empty() admits it is empty, so a live shared proto is never unlinked. A proto the request created is reclaimed unconditionally - it is the only owner, so marking it for deletion is safe even without a delete_empty callback. Classifiers without one (the check marks the proto unconditionally) are rtnl-serialized, so the raced window this guard closes cannot arise for them.

This is a follow-up to commit d4e359b3608a (“net/sched: cls_api: fix teardown of an adopted proto on insert-race loss”), which stopped the loser of the insert race from unlinking the winner’s live proto but left the empty-proto residual in place.

Conditions to recreate:

  • CONFIG_NET_CLS_FLOWER=y; veth pair
  • tc qdisc add dev veth0 ingress
  • two concurrent tc filter add dev veth0 ingress protocol ip pref 1 flower skip_sw ... action drop (both fail in fl_hw_replace_filter after publishing their handle in the idr); repeat in a loop
  • an empty flower tp stays linked after both requests fail; visible as a bare filter protocol ip pref 1 flower chain 0 header in tc filter show with no filter entries
  • CAP_NET_ADMIN (namespace-local via unshare -Urn suffices)

Details

Affected packages:
linux @ 5.10.259 (+6 more)

Fixes