{"id":29115,"date":"2026-09-25T20:31:54","date_gmt":"2026-09-25T12:31:54","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-97959"},"modified":"2026-09-25T20:31:54","modified_gmt":"2026-09-25T12:31:54","slug":"cve-2026-97959","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-97959","title":{"rendered":"CVE-2026-97959 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnet\/sched: cls_route:"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/sched: cls_route: free emptied bucket on filter move<\/p>\n<p>route4_change can move an existing filter to a different top-level<br \/>\nbucket: route4_set_parms recomputes the handle from TCA_ROUTE4_TO\/<br \/>\nFROM\/IIF, and the handle-mismatch check is gated on the &#8216;new&#8217; flag, so<br \/>\nfor an existing filter the new handle may differ from the old one and<br \/>\nland in a different bucket. When this happens, the filter is unlinked<br \/>\nfrom the old bucket, but the bucket itself is never freed once it goes<br \/>\nempty. The stale empty bucket remains in head-&gt;table[], causing<br \/>\nroute4_delete to report *last=false even after the last live filter is<br \/>\ngone. That pins the empty tcf_proto and causes a leak.<\/p>\n<p>Fix this by refcounting the filters linked to a bucket and freeing the<br \/>\nbucket when the count drops to zero. The existing scan in route4_delete<br \/>\ngoes away with it.<\/p>\n<p>The count is updated at all sites that link or unlink a filter during add,<br \/>\nchange and delete, and the bucket is dropped from head-&gt;table[] as soon as<br \/>\nit reaches zero.<\/p>\n<p>Conditions to recreate the bug:<br \/>\n  CONFIG_NET_CLS_ROUTE4=y, CONFIG_NET_SCH_INGRESS=y, CONFIG_NET_CLS_ACT=y.<\/p>\n<p>  tc qdisc replace dev lo clsact<br \/>\n  tc filter add dev lo ingress protocol ip pref 100 route from 1 to 1<br \/>\n  tc filter change dev lo ingress protocol ip pref 100 handle 0x10001<br \/>\n    route from 1 to 2<br \/>\n  tc filter del dev lo ingress protocol ip pref 100 handle 0x10002<br \/>\n    route from 1 to 2<br \/>\n  tc filter show dev lo ingress | grep -c &#8216;pref 100 route chain 0 &#8216;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/sched: cls_route: free emptied bucket on filter move<\/p>\n<p>route4_change can move an existing filter to a different top-level<br \/>\nbucket<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-29115","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/29115","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=29115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=29115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=29115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}