`sbi->sb_size > (1 << sbi->blkszbits) - EROFS_SUPER_OFFSET ` doesn't work correctly when the block size is 1024.
Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com> --- lib/super.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/super.c b/lib/super.c index fb644bc..8efef50 100644 --- a/lib/super.c +++ b/lib/super.c @@ -76,13 +76,13 @@ int erofs_read_superblock(struct erofs_sb_info *sbi) { u8 data[EROFS_MAX_BLOCK_SIZE]; struct erofs_super_block *dsb; - int ret; + int read, ret; - sbi->blkszbits = ilog2(EROFS_MAX_BLOCK_SIZE); - ret = erofs_blk_read(sbi, 0, data, 0, erofs_blknr(sbi, sizeof(data))); - if (ret < 0) { + read = erofs_io_pread(&sbi->bdev, data, 0, EROFS_MAX_BLOCK_SIZE); + if (read < EROFS_SUPER_END) { + ret = read < 0 ? read : -EIO; erofs_err("cannot read erofs superblock: %d", ret); - return -EIO; + return ret; } dsb = (struct erofs_super_block *)(data + EROFS_SUPER_OFFSET); @@ -105,9 +105,8 @@ int erofs_read_superblock(struct erofs_sb_info *sbi) } sbi->sb_size = 128 + dsb->sb_extslots * EROFS_SB_EXTSLOT_SIZE; - if (sbi->sb_size > (1 << sbi->blkszbits) - EROFS_SUPER_OFFSET) { - erofs_err("invalid sb_extslots %u (more than a fs block)", - dsb->sb_extslots); + if (sbi->sb_size > read - EROFS_SUPER_OFFSET) { + erofs_err("invalid sb_extslots %u", dsb->sb_extslots); return -EINVAL; } sbi->primarydevice_blocks = le32_to_cpu(dsb->blocks_lo); -- 2.43.5