<?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 00:25:23 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-64347 — usb: gadget: composite: fix dead empty check in the USB_DT_OTG handler</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-64347</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: composite: fix dead empty check in the USB_DT_OTG handler&lt;/p&gt;
&lt;p&gt;The OTG branch of composite_setup() falls back to the first
configuration when none is selected:&lt;/p&gt;
&lt;p&gt;if (cdev-&amp;gt;config)
		config = cdev-&amp;gt;config;
	else
		config = list_first_entry(&amp;amp;cdev-&amp;gt;configs,
					  struct usb_configuration, list);
	if (!config)
		goto done;
	...
	memcpy(req-&amp;gt;buf, config-&amp;gt;descriptors[0], value);&lt;/p&gt;
&lt;p&gt;list_first_entry() never returns NULL. On an empty list it returns
container_of() of the list head. So the &amp;#34;if (!config)&amp;#34; check is dead.&lt;/p&gt;
&lt;p&gt;When cdev-&amp;gt;configs is empty, config points at the head inside struct
usb_composite_dev. config-&amp;gt;descriptors[0] reads whatever sits at that
offset. The memcpy copies up to w_length bytes of it into the response
buffer.&lt;/p&gt;
&lt;p&gt;cdev-&amp;gt;configs can be empty in two cases. One is a teardown race on
gadget unbind with a control transfer in flight. The other is a driver
that sets is_otg before it adds a config. A reproducer that holds
cdev-&amp;gt;configs empty triggers a KASAN fault in this branch.&lt;/p&gt;
&lt;p&gt;Use list_first_entry_or_null() so the existing check does its job.&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: composite: fix dead empty check in the USB_DT_OTG handler&lt;/p&gt;
&lt;p&gt;The OTG branch of composite_setup() falls back to the first
configuration when none is selected:&lt;/p&gt;
&lt;p&gt;if (cdev-&amp;gt;config)
		config = cdev-&amp;gt;config;
	else
		config = list_first_entry(&amp;amp;cdev-&amp;gt;configs,
					  struct usb_configuration, list);
	if (!config)
		goto done;
	...
	memcpy(req-&amp;gt;buf, config-&amp;gt;descriptors[0], value);&lt;/p&gt;
&lt;p&gt;list_first_entry() never returns NULL. On an empty list it returns
container_of() of the list head. So the &amp;#34;if (!config)&amp;#34; check is dead.&lt;/p&gt;
&lt;p&gt;When cdev-&amp;gt;configs is empty, config points at the head inside struct
usb_composite_dev. config-&amp;gt;descriptors[0] reads whatever sits at that
offset. The memcpy copies up to w_length bytes of it into the response
buffer.&lt;/p&gt;
&lt;p&gt;cdev-&amp;gt;configs can be empty in two cases. One is a teardown race on
gadget unbind with a control transfer in flight. The other is a driver
that sets is_otg before it adds a config. A reproducer that holds
cdev-&amp;gt;configs empty triggers a KASAN fault in this branch.&lt;/p&gt;
&lt;p&gt;Use list_first_entry_or_null() so the existing check does its job.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-64347</guid>
    </item>
  </channel>
</rss>
