{"id":33371,"date":"2026-10-06T20:31:52","date_gmt":"2026-10-06T12:31:52","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98302"},"modified":"2026-10-06T20:31:52","modified_gmt":"2026-10-06T12:31:52","slug":"cve-2026-98302","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98302","title":{"rendered":"CVE-2026-98302 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnet: fddi: skfp: fix"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net: fddi: skfp: fix NULL deref when setting the MAC address while down<\/p>\n<p>skfp_ctl_set_mac_address() calls ResetAdapter() unconditionally, without<br \/>\nchecking netif_running(). ResetAdapter() first calls card_stop(), which<br \/>\nsets smc-&gt;hw.hw_state to STOPPED, and then mac_drv_clear_tx_queue(),<br \/>\nwhich walks the two transmit queues:<\/p>\n<p>\tfor (i = QUEUE_S; i hw.fp.tx[i] ;<br \/>\n\t\t&#8230;<br \/>\n\t\tt = queue-&gt;tx_curr_get ;<\/p>\n<p>smc-&gt;hw.fp.tx[] is only populated by init_tx(), which is reached from<br \/>\nskfp_open() through init_smt() -&gt; init_fddi_driver() -&gt; init_fplus() -&gt;<br \/>\ninit_mac() -&gt; init_tx(). The private area is allocated and zeroed by<br \/>\nalloc_fddidev(), so on an interface that has never been brought up both<br \/>\nqueue pointers are still NULL. The hw_state test at the top of<br \/>\nmac_drv_clear_tx_queue() does not catch this, because card_stop() has<br \/>\njust set STOPPED; the function proceeds into the loop and dereferences<br \/>\nNULL. ResetAdapter() does call init_smt() itself, but only after the<br \/>\nqueues have been cleared.<\/p>\n<p>Setting the MAC address on a down interface therefore oopses:<\/p>\n<p>  ip link set dev fddi0 address 02:00:00:00:00:01<\/p>\n<p>  BUG: KASAN: null-ptr-deref in mac_drv_clear_tx_queue+0x68\/0x2c0 [skfp]<br \/>\n  Read of size 8 at addr 0000000000000010 by task ip\/302<br \/>\n  Call Trace:<\/p>\n<p>   mac_drv_clear_tx_queue+0x68\/0x2c0 [skfp 6c01d4bab63c36978bd0a7d7e90837adb44cc37b]<br \/>\n   ResetAdapter+0x29\/0x100 [skfp 6c01d4bab63c36978bd0a7d7e90837adb44cc37b]<br \/>\n   skfp_ctl_set_mac_address+0x57\/0x80 [skfp 6c01d4bab63c36978bd0a7d7e90837adb44cc37b]<br \/>\n   netif_set_mac_address+0x1e4\/0x2c0<br \/>\n   do_setlink+0x684\/0x2680<\/p>\n<p>Address 0x10 is the offset of tx_curr_get, the third pointer in<br \/>\nstruct s_smt_tx_queue, on 64-bit. mac_drv_clear_rx_queue(), which<br \/>\nResetAdapter() calls immediately afterwards, dereferences<br \/>\nsmc-&gt;hw.fp.rx[QUEUE_R1] in the same way behind the same ineffective<br \/>\nhw_state test; the transmit queue merely crashes first. Both are<br \/>\ncovered by the guard below.<\/p>\n<p>Skip the adapter reset when the interface is down. dev_addr_set() is<br \/>\nleft unconditional, so the new address is still recorded in<br \/>\ndev-&gt;dev_addr. Nothing is lost by not resetting the adapter here:<br \/>\nskfp_open() deliberately re-reads the factory address on every open,<\/p>\n<p>\tread_address(smc, NULL);<br \/>\n\teth_hw_addr_set(dev, smc-&gt;hw.fddi_canon_addr.a);<\/p>\n<p>and the comment above it states this is done to discard exactly such an<br \/>\naddress override across a close\/open cycle. An address set while the<br \/>\ninterface is down could not have survived the following open even<br \/>\nbefore this change, so the guard removes no working behaviour. Guarding<br \/>\nthe hardware side of ndo_set_mac_address() with netif_running() is<br \/>\nestablished practice; skge_set_mac_address() has done so since commit<br \/>\n2eb3e621c4e0 (&#8220;skge: set mac address bonding fix&#8221;).<\/p>\n<p>Guarding the reset as a whole, rather than NULL-checking the queues, is<br \/>\nalso what the rest of the driver expects. After a previous open\/close<br \/>\nthe queue pointers are stale but non-NULL, so there is no crash, yet<br \/>\nResetAdapter() goes on to call smt_online() and STI_FBI() (&#8220;Enable<br \/>\nBoard Interrupts&#8221;) while skfp_close() has already called free_irq() &#8211;<br \/>\nthe adapter would be brought back online with no handler installed. The<br \/>\nonly other ResetAdapter() caller is skfp_interrupt(), which by<br \/>\nconstruction runs only while the device is open.<\/p>\n<p>Found by automated driver testing against an emulated SysKonnect FDDI<br \/>\nadapter under a KASAN-enabled 7.0.0 kernel. Triggering it requires<br \/>\nCAP_NET_ADMIN.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net: fddi: skfp: fix NULL deref when setting the MAC address while down<\/p>\n<p>skfp_ctl_set_mac_address() calls ResetAdapter() unconditio<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-33371","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/33371","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=33371"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=33371"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=33371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}