<?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>Wed, 30 Sep 2026 06:56:56 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-72342 — net/mlx5e: Fix HV VHCA stats agent registration race</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-72342</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;net/mlx5e: Fix HV VHCA stats agent registration race&lt;/p&gt;
&lt;p&gt;mlx5e_hv_vhca_stats_create() registers the stats agent through
mlx5_hv_vhca_agent_create(). The helper publishes the agent in
hv_vhca-&amp;gt;agents[type] under agents_lock and immediately schedules an
asynchronous control invalidation on the HV VHCA workqueue before
returning to mlx5e.&lt;/p&gt;
&lt;p&gt;The asynchronous invalidation invokes the control agent&amp;#39;s invalidate
callback, which reads the hypervisor control block and forwards the
command to mlx5e_hv_vhca_stats_control(). That callback may either:&lt;/p&gt;
&lt;p&gt;- call cancel_delayed_work_sync(&amp;amp;priv-&amp;gt;stats_agent.work), or
  - call queue_delayed_work(priv-&amp;gt;wq, &amp;amp;sagent-&amp;gt;work, sagent-&amp;gt;delay).&lt;/p&gt;
&lt;p&gt;However, the delayed_work and priv-&amp;gt;stats_agent.agent are only
initialized after mlx5_hv_vhca_agent_create() returns to mlx5e:&lt;/p&gt;
&lt;p&gt;agent = mlx5_hv_vhca_agent_create(...);   /* publish + invalidate */
    ...
    priv-&amp;gt;stats_agent.agent = agent;          /* too late */
    INIT_DELAYED_WORK(&amp;amp;priv-&amp;gt;stats_agent.work, ...); /* too late */&lt;/p&gt;
&lt;p&gt;If the asynchronous control path runs before the two assignments
above, it can:&lt;/p&gt;
&lt;p&gt;- Operate on an uninitialized delayed_work whose timer.function is
    NULL. queue_delayed_work() calls add_timer() unconditionally, so
    when the timer expires the timer softirq invokes a NULL function
    pointer.
  - Re-initialize the timer later through INIT_DELAYED_WORK() while
    the timer is already enqueued in the timer…&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;net/mlx5e: Fix HV VHCA stats agent registration race&lt;/p&gt;
&lt;p&gt;mlx5e_hv_vhca_stats_create() registers the stats agent through
mlx5_hv_vhca_agent_create(). The helper publishes the agent in
hv_vhca-&amp;gt;agents[type] under agents_lock and immediately schedules an
asynchronous control invalidation on the HV VHCA workqueue before
returning to mlx5e.&lt;/p&gt;
&lt;p&gt;The asynchronous invalidation invokes the control agent&amp;#39;s invalidate
callback, which reads the hypervisor control block and forwards the
command to mlx5e_hv_vhca_stats_control(). That callback may either:&lt;/p&gt;
&lt;p&gt;- call cancel_delayed_work_sync(&amp;amp;priv-&amp;gt;stats_agent.work), or
  - call queue_delayed_work(priv-&amp;gt;wq, &amp;amp;sagent-&amp;gt;work, sagent-&amp;gt;delay).&lt;/p&gt;
&lt;p&gt;However, the delayed_work and priv-&amp;gt;stats_agent.agent are only
initialized after mlx5_hv_vhca_agent_create() returns to mlx5e:&lt;/p&gt;
&lt;p&gt;agent = mlx5_hv_vhca_agent_create(...);   /* publish + invalidate */
    ...
    priv-&amp;gt;stats_agent.agent = agent;          /* too late */
    INIT_DELAYED_WORK(&amp;amp;priv-&amp;gt;stats_agent.work, ...); /* too late */&lt;/p&gt;
&lt;p&gt;If the asynchronous control path runs before the two assignments
above, it can:&lt;/p&gt;
&lt;p&gt;- Operate on an uninitialized delayed_work whose timer.function is
    NULL. queue_delayed_work() calls add_timer() unconditionally, so
    when the timer expires the timer softirq invokes a NULL function
    pointer.
  - Re-initialize the timer later through INIT_DELAYED_WORK() while
    the timer is already enqueued in the timer…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-72342</guid>
    </item>
  </channel>
</rss>
