CVE-2026-89490: ocfs2: fix readdir position truncation on 32-bit kernels

Published Sep 11, 2026
·
Updated

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

1 affected component
Linux Kernel>32-bit

Event History

Sep 11, 2026
CVE Published
via MITRE·07:43 PM
Data Sourced
via MITRE·07:43 PM
Description

Frequently Asked Questions

1

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.

2

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.

3

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.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203