<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Fri, 02 Oct 2026 18:14:47 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-63894 — usb: gadget: f_fs: serialize DMABUF cancel against request completion</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-63894</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;usb: gadget: f_fs: serialize DMABUF cancel against request completion&lt;/p&gt;
&lt;p&gt;ffs_epfile_dmabuf_io_complete() calls usb_ep_free_request() on the
completed request but leaves priv-&amp;gt;req, the back-pointer that
ffs_dmabuf_transfer() set on submission, pointing at the freed
memory.  A later FUNCTIONFS_DMABUF_DETACH ioctl or
ffs_epfile_release() on the close path still sees priv-&amp;gt;req
non-NULL under ffs-&amp;gt;eps_lock:&lt;/p&gt;
&lt;p&gt;if (priv-&amp;gt;ep &amp;amp;&amp;amp; priv-&amp;gt;req)
            usb_ep_dequeue(priv-&amp;gt;ep, priv-&amp;gt;req);&lt;/p&gt;
&lt;p&gt;so usb_ep_dequeue() is called on a freed usb_request.&lt;/p&gt;
&lt;p&gt;On dummy_hcd the dequeue path only walks a live queue and
pointer-compares, so the freed pointer reads without faulting and
KASAN requires an explicit check at the FunctionFS call site to
surface the use-after-free.  On SG-capable in-tree UDCs the
dequeue path dereferences the supplied request immediately:&lt;/p&gt;
&lt;p&gt;* chipidea&amp;#39;s ep_dequeue() does
    container_of(req, struct ci_hw_req, req) and reads
    hwreq-&amp;gt;req.status before acquiring its own lock.
  * cdnsp&amp;#39;s cdnsp_gadget_ep_dequeue() reads request-&amp;gt;status first.&lt;/p&gt;
&lt;p&gt;The narrower option of clearing priv-&amp;gt;req via cmpxchg() in the
completion does not close the race: the completion runs without
eps_lock, so a cancel path holding eps_lock can still observe
priv-&amp;gt;req non-NULL, race a concurrent completion that clears and
frees, and pass the freed pointer to usb_ep_dequeue().  A slightly
longer fix that moves the free into the cleanup wo…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;usb: gadget: f_fs: serialize DMABUF cancel against request completion&lt;/p&gt;
&lt;p&gt;ffs_epfile_dmabuf_io_complete() calls usb_ep_free_request() on the
completed request but leaves priv-&amp;gt;req, the back-pointer that
ffs_dmabuf_transfer() set on submission, pointing at the freed
memory.  A later FUNCTIONFS_DMABUF_DETACH ioctl or
ffs_epfile_release() on the close path still sees priv-&amp;gt;req
non-NULL under ffs-&amp;gt;eps_lock:&lt;/p&gt;
&lt;p&gt;if (priv-&amp;gt;ep &amp;amp;&amp;amp; priv-&amp;gt;req)
            usb_ep_dequeue(priv-&amp;gt;ep, priv-&amp;gt;req);&lt;/p&gt;
&lt;p&gt;so usb_ep_dequeue() is called on a freed usb_request.&lt;/p&gt;
&lt;p&gt;On dummy_hcd the dequeue path only walks a live queue and
pointer-compares, so the freed pointer reads without faulting and
KASAN requires an explicit check at the FunctionFS call site to
surface the use-after-free.  On SG-capable in-tree UDCs the
dequeue path dereferences the supplied request immediately:&lt;/p&gt;
&lt;p&gt;* chipidea&amp;#39;s ep_dequeue() does
    container_of(req, struct ci_hw_req, req) and reads
    hwreq-&amp;gt;req.status before acquiring its own lock.
  * cdnsp&amp;#39;s cdnsp_gadget_ep_dequeue() reads request-&amp;gt;status first.&lt;/p&gt;
&lt;p&gt;The narrower option of clearing priv-&amp;gt;req via cmpxchg() in the
completion does not close the race: the completion runs without
eps_lock, so a cancel path holding eps_lock can still observe
priv-&amp;gt;req non-NULL, race a concurrent completion that clears and
frees, and pass the freed pointer to usb_ep_dequeue().  A slightly
longer fix that moves the free into the cleanup wo…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-63894</guid>
    </item>
  </channel>
</rss>
