UBUNTU-CVE-2026-99253: Medium severity ubuntu/linux vulnerability
In the Linux kernel, the following vulnerability has been resolved: iouring/cancel: rearm local work wake up before sleep iouringtrycancelrequests() sets ->cqwaitnr to 1 so that the next ioreqlocalworkadd() wakes the cancelling task. The add that takes the count to zero is the only one that wakes, later ones see a count <= 0 and return. iouringcancelgeneric() however only becomes TASKINTERRUPTIBLE much later, so the one wake up can be spent on a running task. That is fine as long as the entry of that add is still queued, as the iolocalworkpending() check then skips the sleep. It is not if the add was delayed after queueing its entry: CPU0 (submitter in exec or exit) CPU1 (ioreqlocalworkadd) mpscqpush(req A) iouringtrycancelrequests() iorunlocalwork() // runs req A iouringtrycancelrequests() atomicset(&ctx->cqwaitnr, 1) atomicread(&ctx->cqwaitnr) == 1 count taken, wakeupstate() // task is running, no-op preparetowait(TASKINTERRUPTIBLE) iolocalworkpending() == false schedule() mpscqpush(req B) cqwaitnr <= 0, return Only the sleeping task can run req B, so it is stuck in execve() until a signal happens to wake it. An exiting task doesn't even get that. Arm the count again once the task state is set and before the work list is checked, for the rings whose local work this task is the one to run.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Compensating control
Rearm the local-work wake-up count after the cancelling task enters its sleep state and before checking the work list, for rings where that task is responsible for running local work.
Event History
Frequently Asked Questions
Which Ubuntu kernel package variants are listed as affected?
The listed software includes ubuntu/linux, ubuntu/linux-fips, ubuntu/linux-aws, ubuntu/linux-azure, ubuntu/linux-gcp, ubuntu/linux-oracle, ubuntu/linux-aws-fips, and ubuntu/linux-azure-fips.
What conditions are needed to trigger the hang?
The issue involves io_uring request cancellation racing with locally queued work. A local-work wakeup can be consumed while the cancelling task is still running, then another work item can arrive after the task has gone to sleep without generating another wakeup.
How might an affected system behave?
A task performing execve() can become stuck when it is the only task able to run the queued local work. The description states that it remains stuck until a signal happens to wake it; an exiting task may be affected as well.