CVE-2026-90201: net: page_pool: fix UAF in __page_pool_release_netmem_dma on xa_cmpxchg race

Published Sep 17, 2026
·
Updated

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

net: pagepool: fix UAF in pagepoolreleasenetmemdma on xacmpxchg race

This bug was discovered while testing the hns3 driver under channel reconfiguration (ethtool -L / ethtool -G) with iperf3 traffic on arm64. The race is intermittently triggered when pagepooldestroy() runs pagepoolscrub() concurrently with page return via pagepoolputnetmem() on a different CPU. A WARN in pagepoolclearppinfo() surfaced the dangling DMA index bits left by the cmpxchg loser, which led to the investigation.

pagepoolscrub() iterates pool->dmamapped via xaforeach() with no page ref held. pagepoolreleasenetmemdma() currently reads and writes netmem fields (dmaaddr, DMA index bits in ppmagic) after xacmpxchg() returns. The unref path calls putpage() unconditionally regardless of the cmpxchg outcome; when it loses the cmpxchg, it still frees the page before the scrub winner finishes these netmem accesses, so scrub touches a freed page -- a Use-After-Free.

Fix this by splitting the DMA release into two functions:

1. pagepoolunmapnetmemdma() caches dmaaddr before xacmpxchg(), does the cmpxchg to remove the DMA mapping, and calls dmaunmap on the cached address. It never touches netmem fields after the cmpxchg, making it safe for the scrub path which holds no page ref.

2. pagepoolreleasenetmemdma() wraps the above and additionally clears dmaaddr and DMA index bits in netmem fields. This is safe only when the caller holds a page ref, so it is used by the return path (pagepoolreturnnetmem).

The scrub path calls pagepoolunmapnetmemdma() directly; the return path calls pagepoolreleasenetmemdma().

Affected Software

1 affected component
Linux Kernel

Event History

Sep 17, 2026
CVE Published
via MITRE·04:07 PM
Data Sourced
via MITRE·04:07 PM
Description

Frequently Asked Questions

1

What conditions are needed to trigger this issue?

The race requires page_pool_destroy() to run page_pool_scrub() concurrently with page return through page_pool_put_netmem() on another CPU. It was intermittently observed during hns3 channel reconfiguration using ethtool -L or ethtool -G while iperf3 traffic was active on arm64.

2

Which systems are most likely exposed?

Systems using the Linux kernel page_pool code and exercising concurrent page-pool teardown and page return are relevant. The reported test case involved the hns3 driver, active network traffic, and channel reconfiguration; the provided data does not establish that this is limited to hns3 or arm64.

3

How can an affected system present?

Testing exposed a WARN in page_pool_clear_pp_info() caused by dangling DMA index bits after the xa_cmpxchg loser path. The underlying condition is a use-after-free in which page_pool_scrub() can access a page after another path frees it.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203