]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ext4: fix bounds check in check_xattrs() to prevent out-of-bounds access
authorDeepanshu Kartikey <kartikey406@gmail.com>
Sat, 28 Mar 2026 15:00:38 +0000 (20:30 +0530)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 10 Apr 2026 02:01:39 +0000 (22:01 -0400)
The bounds check for the next xattr entry in check_xattrs() uses
(void *)next >= end, which allows next to point within sizeof(u32)
bytes of end. On the next loop iteration, IS_LAST_ENTRY() reads 4
bytes via *(__u32 *)(entry), which can overrun the valid xattr region.

For example, if next lands at end - 1, the check passes since
next < end, but IS_LAST_ENTRY() reads 4 bytes starting at end - 1,
accessing 3 bytes beyond the valid region.

Fix this by changing the check to (void *)next + sizeof(u32) > end,
ensuring there is always enough space for the IS_LAST_ENTRY() read
on the subsequent iteration.

Fixes: 3478c83cf26b ("ext4: improve xattr consistency checking and error reporting")
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/all/20260224231429.31361-1-kartikey406@gmail.com/T/
Signed-off-by: Deepanshu Kartikey <kartikey406@gmail.com>
Link: https://patch.msgid.link/20260328150038.349497-1-kartikey406@gmail.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/xattr.c

index 7bf9ba19a89db2cd9e9536191eb904afe4c5f5d8..c6205b405efe435602f649e3db25211eb617a5f7 100644 (file)
@@ -226,7 +226,7 @@ check_xattrs(struct inode *inode, struct buffer_head *bh,
        /* Find the end of the names list */
        while (!IS_LAST_ENTRY(e)) {
                struct ext4_xattr_entry *next = EXT4_XATTR_NEXT(e);
-               if ((void *)next >= end) {
+               if ((void *)next + sizeof(u32) > end) {
                        err_str = "e_name out of bounds";
                        goto errout;
                }