CVE-2026-89490: ocfs2: fix readdir position truncation on 32-bit kernels
In the Linux kernel, the following vulnerability has been resolved:
ocfs2: fix readdir position truncation on 32-bit kernels
In ocfs2dirforeachblkel(), the directory cookie position is rebuilt with
ctx->pos = (ctx->pos & ~(sb->sblocksize - 1)) | offset;
ctx->pos is lofft (signed 64-bit), while sb->sblocksize is unsigned long. On 32-bit kernels unsigned long is 32-bit, so the mask
~(sb->sblocksize - 1)
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->pos, that unsigned operand is zero-extended to 64 bits per the usual arithmetic conversions, yielding 0x00000000fffff000. The high 32 bits of ctx->pos are silently cleared, even though directory size is allowed to exceed 4 GiB.
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.
This is ocfs2dirforeachblkel(), the extent-list readdir path taken for all non-inline directories, so a directory large enough to cross 4 GiB reaches it.
This is the same class of bug that commit 3dce5bb82c97 ("exfat: Fix bitwise operation having different size") fixed in exfat, and the fix mirrors the equivalent ext4 fix in this series. Cast the operand to lofft so the mask is 64-bit before the AND:
ctx->pos = (ctx->pos & ~((lofft)sb->sblocksize - 1)) | offset;
64-bit kernels are unaffected.
Affected Software
Event History
Frequently Asked Questions
Which systems are affected by this issue?
The issue applies to 32-bit Linux kernels using OCFS2 directories that use the extent-list readdir path. That path is used for all non-inline directories, but the directory must grow beyond 4 GiB for the truncation condition to be reached.
What behavior indicates that a system may be experiencing the problem?
When a directory enumeration crosses the 4 GiB boundary, readdir() can reset its position into an earlier block. The re-validation path may then repeatedly enumerate directory entries that were already returned, potentially indefinitely.
What operation triggers the faulty position handling?
The trigger is directory enumeration through readdir() on a sufficiently large non-inline OCFS2 directory on a 32-bit kernel. The failure occurs when the directory cookie position crosses the 4 GiB boundary.