<?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 16:51:43 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-89490 — ocfs2: fix readdir position truncation on 32-bit kernels</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-89490</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;ocfs2: fix readdir position truncation on 32-bit kernels&lt;/p&gt;
&lt;p&gt;In ocfs2_dir_foreach_blk_el(), the directory cookie position is
rebuilt with&lt;/p&gt;
&lt;p&gt;ctx-&amp;gt;pos = (ctx-&amp;gt;pos &amp;amp; ~(sb-&amp;gt;s_blocksize - 1)) | offset;&lt;/p&gt;
&lt;p&gt;`ctx-&amp;gt;pos` is loff_t (signed 64-bit), while `sb-&amp;gt;s_blocksize` is
unsigned long.  On 32-bit kernels unsigned long is 32-bit, so the mask&lt;/p&gt;
&lt;p&gt;~(sb-&amp;gt;s_blocksize - 1)&lt;/p&gt;
&lt;p&gt;is computed as a 32-bit unsigned value (e.g. 0xfffff000 for a 4 KiB
block size).  In the AND expression with the 64-bit `ctx-&amp;gt;pos`, that
unsigned operand is zero-extended to 64 bits per the usual arithmetic
conversions, yielding 0x00000000fffff000.  The high 32 bits of
`ctx-&amp;gt;pos` are silently cleared, even though directory size is
allowed to exceed 4 GiB.&lt;/p&gt;
&lt;p&gt;When readdir() crosses the 4 GiB boundary on a 32-bit kernel the
position is reset back into the first 4 GiB block, making the
re-validation path re-enumerate already-returned dirents indefinitely.&lt;/p&gt;
&lt;p&gt;This is ocfs2_dir_foreach_blk_el(), the extent-list readdir path taken
for all non-inline directories, so a directory large enough to cross
4 GiB reaches it.&lt;/p&gt;
&lt;p&gt;This is the same class of bug that commit 3dce5bb82c97 (&amp;#34;exfat: Fix
bitwise operation having different size&amp;#34;) fixed in exfat, and the
fix mirrors the equivalent ext4 fix in this series.  Cast the operand
to loff_t so the mask is 64-bit before the AND:&lt;/p&gt;
&lt;p&gt;ctx-&amp;gt;pos = (ctx-&amp;gt;pos &amp;amp; ~((loff_t)sb-&amp;gt;s_blocksize - 1)) | offset;&lt;/p&gt;
&lt;p&gt;64-bit kernels are unaffected.&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;ocfs2: fix readdir position truncation on 32-bit kernels&lt;/p&gt;
&lt;p&gt;In ocfs2_dir_foreach_blk_el(), the directory cookie position is
rebuilt with&lt;/p&gt;
&lt;p&gt;ctx-&amp;gt;pos = (ctx-&amp;gt;pos &amp;amp; ~(sb-&amp;gt;s_blocksize - 1)) | offset;&lt;/p&gt;
&lt;p&gt;`ctx-&amp;gt;pos` is loff_t (signed 64-bit), while `sb-&amp;gt;s_blocksize` is
unsigned long.  On 32-bit kernels unsigned long is 32-bit, so the mask&lt;/p&gt;
&lt;p&gt;~(sb-&amp;gt;s_blocksize - 1)&lt;/p&gt;
&lt;p&gt;is computed as a 32-bit unsigned value (e.g. 0xfffff000 for a 4 KiB
block size).  In the AND expression with the 64-bit `ctx-&amp;gt;pos`, that
unsigned operand is zero-extended to 64 bits per the usual arithmetic
conversions, yielding 0x00000000fffff000.  The high 32 bits of
`ctx-&amp;gt;pos` are silently cleared, even though directory size is
allowed to exceed 4 GiB.&lt;/p&gt;
&lt;p&gt;When readdir() crosses the 4 GiB boundary on a 32-bit kernel the
position is reset back into the first 4 GiB block, making the
re-validation path re-enumerate already-returned dirents indefinitely.&lt;/p&gt;
&lt;p&gt;This is ocfs2_dir_foreach_blk_el(), the extent-list readdir path taken
for all non-inline directories, so a directory large enough to cross
4 GiB reaches it.&lt;/p&gt;
&lt;p&gt;This is the same class of bug that commit 3dce5bb82c97 (&amp;#34;exfat: Fix
bitwise operation having different size&amp;#34;) fixed in exfat, and the
fix mirrors the equivalent ext4 fix in this series.  Cast the operand
to loff_t so the mask is 64-bit before the AND:&lt;/p&gt;
&lt;p&gt;ctx-&amp;gt;pos = (ctx-&amp;gt;pos &amp;amp; ~((loff_t)sb-&amp;gt;s_blocksize - 1)) | offset;&lt;/p&gt;
&lt;p&gt;64-bit kernels are unaffected.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-89490</guid>
    </item>
  </channel>
</rss>
