{"id":41283,"date":"2026-10-19T00:33:00","date_gmt":"2026-10-18T16:33:00","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98811"},"modified":"2026-10-19T00:33:00","modified_gmt":"2026-10-18T16:33:00","slug":"cve-2026-98811","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98811","title":{"rendered":"CVE-2026-98811 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnet\/sched: cls_api: r"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/sched: cls_api: reclaim an empty proto on the error path<\/p>\n<p>Two racing tc filter add requests on the same chain\/prio of an<br \/>\nunlocked classifier both run change() on the shared proto and both<br \/>\ncan fail: the winner&#8217;s tcf_chain_tp_delete_empty() attempt gives up<br \/>\nbecause the loser&#8217;s handle is still in the idr, and the loser&#8217;s<br \/>\nerror path drops only its own reference without a second reclamation<br \/>\nattempt. The empty proto stays linked in the chain, holding the<br \/>\nchain reference, a block reference and the classifier module<br \/>\nreference until the chain or block is torn down.<\/p>\n<p>Reclaim the proto on the error path of any failed request that holds<br \/>\na proto reference. The reclamation is emptiness-gated:<br \/>\ntcf_chain_tp_delete_empty() unlinks the proto only when<br \/>\ndelete_empty() admits it is empty, so a live shared proto is never<br \/>\nunlinked. A proto the request created is reclaimed unconditionally &#8211;<br \/>\nit is the only owner, so marking it for deletion is safe even without<br \/>\na delete_empty callback. Classifiers without one (the check marks the<br \/>\nproto unconditionally) are rtnl-serialized, so the raced window this<br \/>\nguard closes cannot arise for them.<\/p>\n<p>This is a follow-up to commit d4e359b3608a (&#8220;net\/sched: cls_api: fix<br \/>\nteardown of an adopted proto on insert-race loss&#8221;), which stopped the<br \/>\nloser of the insert race from unlinking the winner&#8217;s live proto but<br \/>\nleft the empty-proto residual in place.<\/p>\n<p>Conditions to recreate:<br \/>\n&#8211; CONFIG_NET_CLS_FLOWER=y; veth pair<br \/>\n&#8211; tc qdisc add dev veth0 ingress<br \/>\n&#8211; two concurrent `tc filter add dev veth0 ingress protocol ip pref 1<br \/>\n  flower skip_sw &#8230; action drop` (both fail in fl_hw_replace_filter<br \/>\n  after publishing their handle in the idr); repeat in a loop<br \/>\n&#8211; an empty flower tp stays linked after both requests fail; visible<br \/>\n  as a bare `filter protocol ip pref 1 flower chain 0` header in<br \/>\n  `tc filter show` with no filter entries<br \/>\n&#8211; CAP_NET_ADMIN (namespace-local via unshare -Urn suffices)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/sched: cls_api: reclaim an empty proto on the error path<\/p>\n<p>Two racing tc filter add requests on the same chain\/prio of an<br \/>\nunlock<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-41283","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/41283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=41283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=41283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=41283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}