Skip to content

Commit fdb24a8

Browse files
plougherakpm00
authored andcommitted
Squashfs: check metadata block offset is within range
Syzkaller reports a "general protection fault in squashfs_copy_data" This is ultimately caused by a corrupted index look-up table, which produces a negative metadata block offset. This is subsequently passed to squashfs_copy_data (via squashfs_read_metadata) where the negative offset causes an out of bounds access. The fix is to check that the offset is within range in squashfs_read_metadata. This will trap this and other cases. Link: https://lkml.kernel.org/r/20260217050955.138351-1-phillip@squashfs.org.uk Fixes: f400e12 ("Squashfs: cache operations") Reported-by: syzbot+a9747fe1c35a5b115d3f@syzkaller.appspotmail.com Closes: https://lore.kernel.org/all/699234e2.a70a0220.2c38d7.00e2.GAE@google.com/ Signed-off-by: Phillip Lougher <phillip@squashfs.org.uk> Cc: Christian Brauner <brauner@kernel.org> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 319d0bf commit fdb24a8

1 file changed

Lines changed: 3 additions & 0 deletions

File tree

fs/squashfs/cache.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,9 @@ int squashfs_read_metadata(struct super_block *sb, void *buffer,
344344
if (unlikely(length < 0))
345345
return -EIO;
346346

347+
if (unlikely(*offset < 0 || *offset >= SQUASHFS_METADATA_SIZE))
348+
return -EIO;
349+
347350
while (length) {
348351
entry = squashfs_cache_get(sb, msblk->block_cache, *block, 0);
349352
if (entry->error) {

0 commit comments

Comments
 (0)