Skip to content

Commit f3f5b7e

Browse files
plougherakpm00
authored andcommitted
Squashfs: check return result of sb_min_blocksize
Syzkaller reports an "UBSAN: shift-out-of-bounds in squashfs_bio_read" bug. Syzkaller forks multiple processes which after mounting the Squashfs filesystem, issues an ioctl("/dev/loop0", LOOP_SET_BLOCK_SIZE, 0x8000). Now if this ioctl occurs at the same time another process is in the process of mounting a Squashfs filesystem on /dev/loop0, the failure occurs. When this happens the following code in squashfs_fill_super() fails. ---- msblk->devblksize = sb_min_blocksize(sb, SQUASHFS_DEVBLK_SIZE); msblk->devblksize_log2 = ffz(~msblk->devblksize); ---- sb_min_blocksize() returns 0, which means msblk->devblksize is set to 0. As a result, ffz(~msblk->devblksize) returns 64, and msblk->devblksize_log2 is set to 64. This subsequently causes the UBSAN: shift-out-of-bounds in fs/squashfs/block.c:195:36 shift exponent 64 is too large for 64-bit type 'u64' (aka 'unsigned long long') This commit adds a check for a 0 return by sb_min_blocksize(). Link: https://lkml.kernel.org/r/[email protected] Fixes: 0aa6661 ("Squashfs: super block operations") Reported-by: [email protected] Closes: https://lore.kernel.org/all/[email protected]/ Signed-off-by: Phillip Lougher <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent bcf34dd commit f3f5b7e

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

fs/squashfs/super.c

+5
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,11 @@ static int squashfs_fill_super(struct super_block *sb, struct fs_context *fc)
202202
msblk->panic_on_errors = (opts->errors == Opt_errors_panic);
203203

204204
msblk->devblksize = sb_min_blocksize(sb, SQUASHFS_DEVBLK_SIZE);
205+
if (!msblk->devblksize) {
206+
errorf(fc, "squashfs: unable to set blocksize\n");
207+
return -EINVAL;
208+
}
209+
205210
msblk->devblksize_log2 = ffz(~msblk->devblksize);
206211

207212
mutex_init(&msblk->meta_index_mutex);

0 commit comments

Comments
 (0)