Linux Kernel io-wq: Missing Signal Causes Work Hang During Thread Exit
CVE-2026-99228 Published on November 2, 2026
io_uring/io-wq: don't lose the signal that ends work
In the Linux kernel, the following vulnerability has been resolved:
io_uring/io-wq: don't lose the signal that ends work
When a thread exits, only its tracked requests are cancelled. Then its
io-wq is torn down. io_wq_exit_workers() signals every worker, to get it
out of an interruptible sleep, and waits for all of them to exit. Before
they do, they go through the work that is left. Unbounded work is
cancelled. Bounded work is run, as it is expected to end by itself.
Not all of it does. An open has no file yet, so it counts as bounded, and
the open of a FIFO waits for the other end. That is what the signal is for.
But the workers are signalled once, and a worker that hasn't started the
work by then loses the signal:
io_wq_exit_workers() io_worker_handle_work()
io_wq_worker_wake()
set TIF_NOTIFY_SIGNAL
io_assign_current_work()
io_run_task_work()
clear TIF_NOTIFY_SIGNAL
io_wq_submit_work()
fifo_open()
wait_for_partner()
wait_for_completion_timeout()
The thread never gets out of do_exit():
IORING_OP_OPENAT of a FIFO without a writer, IOSQE_ASYNC
exit of the thread that has submitted it
hangs in more than 9 of 10 attempts (4 CPUs, KVM), until the process is
killed.
Set TIF_NOTIFY_SIGNAL for bounded work that is started with IO_WQ_BIT_EXIT
set. The bit is set before the workers are signalled, and it is tested
after the flag has been cleared, with clear_notify_signal() providing the
barrier. So either the flag stays, or the bit is seen.
Work that is started while the io-wq exits is treated like work that is
being run at that time: it isn't interrupted unless it waits
interruptibly.
Products Associated with CVE-2026-99228
Want to know whenever a new CVE is published for Linux Kernel? stack.watch will email you.
Affected Versions
Linux:- Version afcc4015d1bf5659b8c722aff679e9b8c41ee156 and below ddccc60f036b309430cf130d48aafed94ef7355a is affected.
- Version afcc4015d1bf5659b8c722aff679e9b8c41ee156 and below 08c42055b8f9a5d29236d34ad4bce08828239fe1 is affected.
- Version afcc4015d1bf5659b8c722aff679e9b8c41ee156 and below 62996803c1b5f18176de255db4c843021f2d19c8 is affected.
- Version afcc4015d1bf5659b8c722aff679e9b8c41ee156 and below 7309fea05a3d66af9746843c43fef14c10b8141e is affected.
- Version afcc4015d1bf5659b8c722aff679e9b8c41ee156 and below fdb771015c1e13677b57a4015f0c938748f13781 is affected.
- Version 5.12 is affected.
- Before 5.12 is unaffected.
- Version 6.1.191, <= 6.1.* is unaffected.
- Version 6.6.161, <= 6.6.* is unaffected.
- Version 6.12.115, <= 6.12.* is unaffected.
- Version 6.18.60, <= 6.18.* is unaffected.
- Version 7.2.14, <= 7.2.* is unaffected.