CVE-2026-98302

CVE-2026-98302

published October 6, 2026

CVSS
—
EPSS
0%
Percentile
7.6
In the wild
Unconfirmed
What it is

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

net: fddi: skfp: fix NULL deref when setting the MAC address while down

skfp_ctl_set_mac_address() calls ResetAdapter() unconditionally, without

checking netif_running(). ResetAdapter() first calls card_stop(), which

sets smc->hw.hw_state to STOPPED, and then mac_drv_clear_tx_queue(),

which walks the two transmit queues:

for (i = QUEUE_S; i <= QUEUE_A0; i++) {

queue = smc->hw.fp.tx[i] ;

...

t = queue->tx_curr_get ;

smc->hw.fp.tx[] is only populated by init_tx(), which is reached from

skfp_open() through init_smt() -> init_fddi_driver() -> init_fplus() ->

init_mac() -> init_tx(). The private area is allocated and zeroed by

alloc_fddidev(), so on an interface that has never been brought up both

queue pointers are still NULL. The hw_state test at the top of

mac_drv_clear_tx_queue() does not catch this, because card_stop() has

just set STOPPED; the function proceeds into the loop and dereferences

NULL. ResetAdapter() does call init_smt() itself, but only after the

queues have been cleared.

Setting the MAC address on a down interface therefore oopses:

ip link set dev fddi0 address 02:00:00:00:00:01

BUG: KASAN: null-ptr-deref in mac_drv_clear_tx_queue+0x68/0x2c0 [skfp]

Read of size 8 at addr 0000000000000010 by task ip/302

Call Trace:

<TASK>

mac_drv_clear_tx_queue+0x68/0x2c0 [skfp 6c01d4bab63c36978bd0a7d7e90837adb44cc37b]

ResetAdapter+0x29/0x100 [skfp 6c01d4bab63c36978bd0a7d7e90837adb44cc37b]

skfp_ctl_set_mac_address+0x57/0x80 [skfp 6c01d4bab63c36978bd0a7d7e90837adb44cc37b]

netif_set_mac_address+0x1e4/0x2c0

do_setlink+0x684/0x2680

</TASK>

Address 0x10 is the offset of tx_curr_get, the third pointer in

struct s_smt_tx_queue, on 64-bit. mac_drv_clear_rx_queue(), which

ResetAdapter() calls immediately afterwards, dereferences

smc->hw.fp.rx[QUEUE_R1] in the same way behind the same ineffective

hw_state test; the transmit queue merely crashes first. Both are

covered by the guard below.

Skip the adapter reset when the interface is down. dev_addr_set() is

left unconditional, so the new address is still recorded in

dev->dev_addr. Nothing is lost by not resetting the adapter here:

skfp_open() deliberately re-reads the factory address on every open,

read_address(smc, NULL);

eth_hw_addr_set(dev, smc->hw.fddi_canon_addr.a);

and the comment above it states this is done to discard exactly such an

address override across a close/open cycle. An address set while the

interface is down could not have survived the following open even

before this change, so the guard removes no working behaviour. Guarding

the hardware side of ndo_set_mac_address() with netif_running() is

established practice; skge_set_mac_address() has done so since commit

2eb3e621c4e0 ("skge: set mac address bonding fix").

Guarding the reset as a whole, rather than NULL-checking the queues, is

also what the rest of the driver expects. After a previous open/close

the queue pointers are stale but non-NULL, so there is no crash, yet

ResetAdapter() goes on to call smt_online() and STI_FBI() ("Enable

Board Interrupts") while skfp_close() has already called free_irq() -

the adapter would be brought back online with no handler installed. The

only other ResetAdapter() caller is skfp_interrupt(), which by

construction runs only while the device is open.

Found by automated driver testing against an emulated SysKonnect FDDI

adapter under a KASAN-enabled 7.0.0 kernel. Triggering it requires

CAP_NET_ADMIN.

The record
Technical detail
CVSS
Not scored
CVSS v4.0
Not supplied
EPSS
0.00184 · 7.6th percentile
Published
2026-10-06T13:18Z
References (8)
EPSS history
Timeline
  • 07 OCT 03:43Z
    EPSS moved — → 0%
    epss
  • 06 OCT 08:45Z
    net: fddi: skfp: fix NULL deref when setting the MAC address while down
    cvelistv5