<?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>Tue, 29 Sep 2026 20:16:16 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-31703 — writeback: Fix use after free in inode_switch_wbs_work_fn()</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-31703</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux, Red Hat Enterprise Linux 10, Red Hat Enterprise Linux 6, Red Hat Enterprise Linux 7, Red Hat Enterprise Linux 8, Red Hat Enterprise Linux 9&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;writeback: Fix use after free in inode_switch_wbs_work_fn()&lt;/p&gt;
&lt;p&gt;inode_switch_wbs_work_fn() has a loop like:&lt;/p&gt;
&lt;p&gt;wb_get(new_wb);
  while (1) {
    list = llist_del_all(&amp;amp;new_wb-&amp;gt;switch_wbs_ctxs);
    /* Nothing to do? */
    if (!list)
      break;
    ... process the items ...
  }&lt;/p&gt;
&lt;p&gt;Now adding of items to the list looks like:&lt;/p&gt;
&lt;p&gt;wb_queue_isw()
  if (llist_add(&amp;amp;isw-&amp;gt;list, &amp;amp;wb-&amp;gt;switch_wbs_ctxs))
    queue_work(isw_wq, &amp;amp;wb-&amp;gt;switch_work);&lt;/p&gt;
&lt;p&gt;Because inode_switch_wbs_work_fn() loops when processing isw items, it
can happen that wb-&amp;gt;switch_work is pending while wb-&amp;gt;switch_wbs_ctxs is
empty. This is a problem because in that case wb can get freed (no isw
items -&amp;gt; no wb reference) while the work is still pending causing
use-after-free issues.&lt;/p&gt;
&lt;p&gt;We cannot just fix this by cancelling work when freeing wb because that
could still trigger problematic 0 -&amp;gt; 1 transitions on wb refcount due to
wb_get() in inode_switch_wbs_work_fn(). It could be all handled with
more careful code but that seems unnecessarily complex so let&amp;#39;s avoid
that until it is proven that the looping actually brings practical
benefit. Just remove the loop from inode_switch_wbs_work_fn() instead.
That way when wb_queue_isw() queues work, we are guaranteed we have
added the first item to wb-&amp;gt;switch_wbs_ctxs and nobody is going to
remove it (and drop the wb reference it holds) until the queued work
runs.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux, Red Hat Enterprise Linux 10, Red Hat Enterprise Linux 6, Red Hat Enterprise Linux 7, Red Hat Enterprise Linux 8, Red Hat Enterprise Linux 9&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;writeback: Fix use after free in inode_switch_wbs_work_fn()&lt;/p&gt;
&lt;p&gt;inode_switch_wbs_work_fn() has a loop like:&lt;/p&gt;
&lt;p&gt;wb_get(new_wb);
  while (1) {
    list = llist_del_all(&amp;amp;new_wb-&amp;gt;switch_wbs_ctxs);
    /* Nothing to do? */
    if (!list)
      break;
    ... process the items ...
  }&lt;/p&gt;
&lt;p&gt;Now adding of items to the list looks like:&lt;/p&gt;
&lt;p&gt;wb_queue_isw()
  if (llist_add(&amp;amp;isw-&amp;gt;list, &amp;amp;wb-&amp;gt;switch_wbs_ctxs))
    queue_work(isw_wq, &amp;amp;wb-&amp;gt;switch_work);&lt;/p&gt;
&lt;p&gt;Because inode_switch_wbs_work_fn() loops when processing isw items, it
can happen that wb-&amp;gt;switch_work is pending while wb-&amp;gt;switch_wbs_ctxs is
empty. This is a problem because in that case wb can get freed (no isw
items -&amp;gt; no wb reference) while the work is still pending causing
use-after-free issues.&lt;/p&gt;
&lt;p&gt;We cannot just fix this by cancelling work when freeing wb because that
could still trigger problematic 0 -&amp;gt; 1 transitions on wb refcount due to
wb_get() in inode_switch_wbs_work_fn(). It could be all handled with
more careful code but that seems unnecessarily complex so let&amp;#39;s avoid
that until it is proven that the looping actually brings practical
benefit. Just remove the loop from inode_switch_wbs_work_fn() instead.
That way when wb_queue_isw() queues work, we are guaranteed we have
added the first item to wb-&amp;gt;switch_wbs_ctxs and nobody is going to
remove it (and drop the wb reference it holds) until the queued work
runs.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-31703</guid>
    </item>
  </channel>
</rss>
