CVE-2026-46110CWE-476

CVE-2026-46110

High · published May 28, 2026

CVSS v3.1
7.5
EPSS
1%
Percentile
52.6
In the wild
Unconfirmed
What it is

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

net: stmmac: Prevent NULL deref when RX memory exhausted

The CPU receives frames from the MAC through conventional DMA: the CPU

allocates buffers for the MAC, then the MAC fills them and returns

ownership to the CPU. For each hardware RX queue, the CPU and MAC

coordinate through a shared ring array of DMA descriptors: one

descriptor per DMA buffer. Each descriptor includes the buffer's

physical address and a status flag ("OWN") indicating which side owns

the buffer: OWN=0 for CPU, OWN=1 for MAC. The CPU is only allowed to set

the flag and the MAC is only allowed to clear it, and both must move

through the ring in sequence: thus the ring is used for both

"submissions" and "completions."

In the stmmac driver, stmmac_rx() bookmarks its position in the ring

with the `cur_rx` index. The main receive loop in that function checks

for rx_descs[cur_rx].own=0, gives the corresponding buffer to the

network stack (NULLing the pointer), and increments `cur_rx` modulo the

ring size. After the loop exits, stmmac_rx_refill(), which bookmarks its

position with `dirty_rx`, allocates fresh buffers and rearms the

descriptors (setting OWN=1). If it fails any allocation, it simply stops

early (leaving OWN=0) and will retry where it left off when next called.

This means descriptors have a three-stage lifecycle (terms my own):

- `empty` (OWN=1, buffer valid)

- `full` (OWN=0, buffer valid and populated)

- `dirty` (OWN=0, buffer NULL)

But because stmmac_rx() only checks OWN, it confuses `full`/`dirty`. In

the past (see 'Fixes:'), there was a bug where the loop could cycle

`cur_rx` all the way back to the first descriptor it dirtied, resulting

in a NULL dereference when mistaken for `full`. The aforementioned

commit resolved that *specific* failure by capping the loop's iteration

limit at `dma_rx_size - 1`, but this is only a partial fix: if the

previous stmmac_rx_refill() didn't complete, then there are leftover

`dirty` descriptors that the loop might encounter without needing to

cycle fully around. The current code therefore panics (see 'Closes:')

when stmmac_rx_refill() is memory-starved long enough for `cur_rx` to

catch up to `dirty_rx`.

Fix this by explicitly checking, before advancing `cur_rx`, if the next

entry is dirty; exit the loop if so. This prevents processing of the

final, used descriptor until stmmac_rx_refill() succeeds, but

fully prevents the `cur_rx == dirty_rx` ambiguity as the previous bugfix

intended: so remove the clamp as well. Since stmmac_rx_zc() is a

copy-paste-and-tweak of stmmac_rx() and the code structure is identical,

any fix to stmmac_rx() will also need a corresponding fix for

stmmac_rx_zc(). Therefore, apply the same check there.

In stmmac_rx() (not stmmac_rx_zc()), a related bug remains: after the

MAC sets OWN=0 on the final descriptor, it will be unable to send any

further DMA-complete IRQs until it's given more `empty` descriptors.

Currently, the driver simply *hopes* that the next stmmac_rx_refill()

succeeds, risking an indefinite stall of the receive process if not. But

this is not a regression, so it can be addressed in a future change.

The record
Technical detail
CVSS v3.1
7.5 · HIGH
Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
CVSS v4.0
Not supplied
EPSS
0.00700 · 52.6th percentile
Weakness
CWE-476 · NULL Pointer Dereference
Published
2026-05-28T14:16Z
Affected products (15)
ProductVersionsFixed in
linux/linux_kernel≥ 6.1.64, < 6.1.1766.1.176
linux/linux_kernel≥ 6.5.13, < 6.66.6
linux/linux_kernel≥ 6.6.3, < 6.6.1406.6.140
linux/linux_kernel≥ 6.7.1, < 6.12.886.12.88
linux/linux_kernel≥ 6.13, < 6.18.306.18.30
linux/linux_kernel≥ 6.19, < 7.0.77.0.7
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (7)
EPSS history
Timeline
  • 28 MAY 09:35Z
    net: stmmac: Prevent NULL deref when RX memory exhausted
    cvelistv5