CVE-2026-99243
io-wq: order the exit bit against worker creation task work
CVE-2026-99243 is a vulnerability with no CVSS score yet in Linux, published November 3, 2026. No source lists public exploit code. Fixed in linux 6.12.115-1.
In the Linux kernel, the following vulnerability has been resolved:
io-wq: order the exit bit against worker creation task work
io_wq_exit_workers() cancels task work for queued worker creation with task_work_cancel_match(). That has a plain load of task->task_works.
io_queue_worker_create() adds the new entry and tests IO_WQ_BIT_EXIT to cancel it if the workqueue is already on its way out.
That must be ordered. task_work_add() has a full barrier via cmpxchg(). But io_wq_exit_start() sets the bit with set_bit() which doesn't have any memory ordering.
So afaict, on weakly ordered architectures the exiting task may load task_works before the store of the bit is visible. The other side tests the bit before the store is visible as well. So the entry remains queued with worker_refs and the exiting task waits on worker_done indefinitely.
If the task still has rings then io_uring_del_tctx_node() provides the barrier via test_and_set_bit() in io_wq_set_exit_on_idle(). When it has closed all rings though that barrier is gone.
Add the barrier after the set_bit().
What each source reports
CVE List No score
io-wq: order the exit bit against worker creation task work
In the Linux kernel, the following vulnerability has been resolved:
io-wq: order the exit bit against worker creation task work
io_wq_exit_workers() cancels task work for queued worker creation with task_work_cancel_match(). That has a plain load of task->task_works.
io_queue_worker_create() adds the new entry and tests IO_WQ_BIT_EXIT to cancel it if the workqueue is already on its way out.
That must be ordered. task_work_add() has a full barrier via cmpxchg(). But io_wq_exit_start() sets the bit with set_bit() which doesn't have any memory ordering.
So afaict, on weakly ordered architectures the exiting task may load task_works before the store of the bit is visible. The other side tests the bit before the store is visible as well. So the entry remains queued with worker_refs and the exiting task waits on worker_done indefinitely.
If the task still has rings then io_uring_del_tctx_node() provides the barrier via test_and_set_bit() in io_wq_set_exit_on_idle(). When it has closed all rings though that barrier is gone.
Add the barrier after the set_bit().
- Record
CVE-2026-99243- Updated
- 2026-11-03
EUVDEUVD-2026-115773 No score
In the Linux kernel, the following vulnerability has been resolved:
io-wq: order the exit bit against worker creation task work
io_wq_exit_workers() cancels task work for queued worker creation with task_work_cancel_match(). That has a plain load of task->task_works.
io_queue_worker_create() adds the new entry and tests IO_WQ_BIT_EXIT to cancel it if the workqueue is already on its way out.
That must be ordered. task_work_add() has a full barrier via cmpxchg(). But io_wq_exit_start() sets the bit with set_bit() which doesn't have any memory ordering.
So afaict, on weakly ordered architectures the exiting task may load task_works before the store of the bit is visible. The other side tests the bit before the store is visible as well. So the entry remains queued with worker_refs and the exiting task waits on worker_done indefinitely.
If the task still has rings then io_uring_del_tctx_node() provides the barrier via test_and_set_bit() in io_wq_set_exit_on_idle(). When it has closed all rings though that barrier is gone.
Add the barrier after the set_bit().
- Record
EUVD-2026-115773- Updated
- 2026-11-03
GitHub AdvisoriesGHSA-f2f3-p4r7-62cx No score
In the Linux kernel, the following vulnerability has been resolved: io-wq: order the exit bit...
In the Linux kernel, the following vulnerability has been resolved:
io-wq: order the exit bit against worker creation task work
io_wq_exit_workers() cancels task work for queued worker creation with task_work_cancel_match(). That has a plain load of task->task_works.
io_queue_worker_create() adds the new entry and tests IO_WQ_BIT_EXIT to cancel it if the workqueue is already on its way out.
That must be ordered. task_work_add() has a full barrier via cmpxchg(). But io_wq_exit_start() sets the bit with set_bit() which doesn't have any memory ordering.
So afaict, on weakly ordered architectures the exiting task may load task_works before the store of the bit is visible. The other side tests the bit before the store is visible as well. So the entry remains queued with worker_refs and the exiting task waits on worker_done indefinitely.
If the task still has rings then io_uring_del_tctx_node() provides the barrier via test_and_set_bit() in io_wq_set_exit_on_idle(). When it has closed all rings though that barrier is gone.
Add the barrier after the set_bit().
- Record
GHSA-f2f3-p4r7-62cx- Updated
- 2026-11-03
NVD No score
In the Linux kernel, the following vulnerability has been resolved:
io-wq: order the exit bit against worker creation task work
io_wq_exit_workers() cancels task work for queued worker creation with task_work_cancel_match(). That has a plain load of task->task_works.
io_queue_worker_create() adds the new entry and tests IO_WQ_BIT_EXIT to cancel it if the workqueue is already on its way out.
That must be ordered. task_work_add() has a full barrier via cmpxchg(). But io_wq_exit_start() sets the bit with set_bit() which doesn't have any memory ordering.
So afaict, on weakly ordered architectures the exiting task may load task_works before the store of the bit is visible. The other side tests the bit before the store is visible as well. So the entry remains queued with worker_refs and the exiting task waits on worker_done indefinitely.
If the task still has rings then io_uring_del_tctx_node() provides the barrier via test_and_set_bit() in io_wq_set_exit_on_idle(). When it has closed all rings though that barrier is gone.
Add the barrier after the set_bit().
- Record
CVE-2026-99243- Updated
- 2026-11-03
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
linuxDebian:12 |
All versions, plus listed versions 6.1.106-16.1.106-26.1.106-36.1.112-16.1.115-1 Show 45 moreShow less6.1.119-16.1.123-16.1.124-16.1.128-16.1.129-16.1.133-16.1.135-16.1.137-16.1.139-16.1.140-16.1.147-16.1.148-16.1.153-16.1.158-16.1.159-16.1.162-16.1.164-16.1.170-16.1.170-26.1.170-36.1.172-16.1.174-16.1.176-16.1.177-16.1.180-16.1.187-16.1.190-16.1.27-16.1.37-16.1.38-16.1.38-26.1.38-2~bpo11+16.1.38-36.1.38-46.1.38-4~bpo11+16.1.52-16.1.55-16.1.55-1~bpo11+16.1.64-16.1.66-16.1.67-16.1.69-16.1.69-1~bpo11+16.1.76-16.1.76-1~bpo11+1 |
None known |
linuxDebian:13 |
before 6.12.115-1, plus listed versions 6.12.100-16.12.101-16.12.105-16.12.107-16.12.111-1 Show 32 moreShow less6.12.113-16.12.38-16.12.41-16.12.43-16.12.43-1~bpo12+16.12.48-16.12.57-16.12.57-1~bpo12+16.12.63-16.12.63-1~bpo12+16.12.69-16.12.69-1~bpo12+16.12.73-16.12.73-1~bpo12+16.12.74-16.12.74-26.12.74-2~bpo12+16.12.85-16.12.85-1~bpo12+16.12.86-16.12.86-1~bpo12+16.12.88-16.12.88-1~bpo12+16.12.90-16.12.90-1~bpo12+16.12.90-26.12.90-2~bpo12+16.12.94-16.12.94-1~bpo12+16.12.95-16.12.95-1~bpo12+16.12.96-1 |
6.12.115-1 |
linuxDebian:14 |
All versions, plus listed versions 6.12.100-16.12.101-16.12.105-16.12.107-16.12.111-1 Show 45 moreShow less6.12.113-16.12.115-16.12.115-26.12.38-16.12.41-16.12.43-16.12.43-1~bpo12+16.12.48-16.12.57-16.12.57-1~bpo12+16.12.63-16.12.63-1~bpo12+16.12.69-16.12.69-1~bpo12+16.12.73-16.12.73-1~bpo12+16.12.74-16.12.74-26.12.74-2~bpo12+16.12.85-16.12.85-1~bpo12+16.12.86-16.12.86-1~bpo12+16.12.88-16.12.88-1~bpo12+16.12.90-16.12.90-1~bpo12+16.12.90-26.12.90-2~bpo12+16.12.94-16.12.94-1~bpo12+16.12.95-16.12.95-1~bpo12+16.12.96-16.13.10-1~exp16.13.11-1~exp16.13.2-1~exp16.13.3-1~exp16.13.4-1~exp16.13.5-1~exp16.13.6-1~exp16.13.7-1~exp16.13.8-1~exp16.13.9-1~exp16.13~rc6-1~exp1 |
None known |
History
| When | Changed | Sources |
|---|---|---|
| 2026-11-03 | references | EUVD |
| 2026-11-03 | affected, aliases, facts, references | OSV |
| 2026-11-03 | facts | EUVD, NVD |
| 2026-11-03 | title | CVE List |
| 2026-11-03 | created | EUVD, GitHub Advisories |
References
git.kernel.org/stable/c/67da3eec264aeb67835886720243ae2dc1463315
git.kernel.org/stable/c/a63c752157eacf49f628359822666b32503d194a
git.kernel.org/stable/c/1432d881d99584105122760133caeff1dce7a9f7
git.kernel.org/stable/c/6cf012a4d5e461c788ecc9dbed67adc31a142644
git.kernel.org/stable/c/0d81cdd433b0a96c5275c01b8172e0b1f71dd595
git.kernel.org/stable/c/75395db7a9b40a2e826c838e648fef8ed1a2d174
Left out here: 472 versions. The JSON record has them.