CVE-2026-64262: fuse-uring: end fuse_req on io-uring cancel task work
In the Linux kernel, the following vulnerability has been resolved:
fuse-uring: end fusereq on io-uring cancel task work
When iouring delivers task work with tw.cancel set (PFEXITING, PFKTHREAD fallback, or percpurefisdying on the ring context), fuseuringsendintask() takes the cancel branch, assigns -ECANCELED, and falls through to fuseuringsend(). That path only flips the entry to FRRSUSERSPACE and completes the iouring cmd; it never discharges the ring entry's owning reference to the fusereq that fuseuringaddreqtoringent() handed it at dispatch time.
fuseuringsendintask() tw.cancel == true err = -ECANCELED fuseuringsend(ent, cmd, err, issueflags) ent->state = FRRSUSERSPACE listmove(&ent->list, &queue->entinuserspace) ent->cmd = NULL iouringcmddone(-ECANCELED) / ent->fusereq still set, req still hashed /
The fusereq stays linked on fpq->processing[hash] and fuserequestend() is never invoked. The originating syscall thread blocks in D-state in requestwaitanswer() until fuseabortconn() runs, which can be the entire connection lifetime. For FRBACKGROUND requests fc->numbackground is never decremented either, so repeated cancels inflate the counter until maxbackground is hit and all later background ops stall. tw.cancel does not imply a connection abort (e.g. a single iouring worker thread exits while the fuse connection stays up), so this cannot be left for fuseabortconn() to clean up.
Ending the req but still routing the entry through fuseuringsend() is not enough: that leaves a req-less entry on entinuserspace, and entlistrequestexpired() dereferences ent->fusereq unconditionally on the head of that list, which would then NULL-deref.
Fix the cancel branch to release the entry directly. Remove it from the queue, complete the iouring cmd, end the fusereq, free the entry, and drop its queuerefs (waking the teardown waiter if it was the last).
Affected Software
Remediation
Event History
Frequently Asked Questions
Who can trigger this issue?
The CVSS vector indicates local access with low privileges is required, and no user interaction is needed. The affected path involves fuse-uring handling canceled io_uring task work.
What conditions lead to the unreleased request?
The problem occurs when io_uring task work is delivered with cancellation set, including during process exit, the PF_KTHREAD fallback, or when the ring context is dying. In that path, the request is completed to io_uring with -ECANCELED but its owning FUSE request reference is not discharged.
How might an affected system behave?
The originating syscall thread can remain blocked in D-state in request_wait_answer() until fuse_abort_conn() runs, potentially for the lifetime of the connection. For background requests, repeated cancellations can also leave fc->num_background undecremented.
What remediation is available?
A patch is available. The supplied stable-kernel references identify the available fixes.