PT-2026-85652 · Linux · Linux

CVE-2026-80811

·

Published

2026-09-04

·

Updated

2026-09-04

None

No severity ratings or metrics are available. When they are, we'll update the corresponding info on the page.
In the Linux kernel, the following vulnerability has been resolved:
io uring/cmd: fix iovec leak when the async cmd is not recycled
An io async cmd carries an iovec array in ->vec.iovec, allocated when the vec has to grow and kept across recycling through ctx->cmd cache. On two paths nothing frees it and io clean op()'s kfree(req->async data) drops the io async cmd without it.
io req uring cleanup() clears the async data flags only when io alloc cache put() succeeds, and the cache holds IO ALLOC CACHE MAX == 128 entries, so once it is full the put fails and the vec is left behind. An NVMe passthrough workload gets there without doing anything unusual: nvme uring cmd io() returns -EIOCBQUEUED, so the io async cmd stays attached for the lifetime of the command and the live object count tracks the queue depth. Above 128 the puts start failing.
->cleanup is the last chance to free an inherited vec, since io req uring cleanup() returns early for an io-wq issued command and is not called at all for one completed without ever being issued. But io clean op() calls ->cleanup only if REQ F NEED CLEANUP is set, and for uring cmd that happens only where the vec has to grow, so a command reusing a large enough cached vec never sets it. io rw alloc async() and io msg alloc async() flag an inherited vec for exactly this reason; io uring cmd prep() does not.
Flag an inherited vec in io uring cmd prep(), and free the vec when the cache put fails, as io req rw cleanup() does.
The leak is invisible under KASAN, where io alloc cache vec kasan() frees the vec unconditionally.
Found an issue in the description? Have something to add? Feel free to write us 👾

Related Identifiers

CVE-2026-80811

Affected Products

Linux