diff options
Diffstat (limited to 'lib/super.c')
-rw-r--r-- | lib/super.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/super.c b/lib/super.c index f952f7e..4d16d29 100644 --- a/lib/super.c +++ b/lib/super.c @@ -104,6 +104,12 @@ int erofs_read_superblock(struct erofs_sb_info *sbi) return ret; } + 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); + return -EINVAL; + } sbi->primarydevice_blocks = le32_to_cpu(dsb->blocks); sbi->meta_blkaddr = le32_to_cpu(dsb->meta_blkaddr); sbi->xattr_blkaddr = le32_to_cpu(dsb->xattr_blkaddr); @@ -114,7 +120,6 @@ int erofs_read_superblock(struct erofs_sb_info *sbi) sbi->packed_nid = le64_to_cpu(dsb->packed_nid); sbi->inos = le64_to_cpu(dsb->inos); sbi->checksum = le32_to_cpu(dsb->checksum); - sbi->extslots = dsb->sb_extslots; sbi->build_time = le64_to_cpu(dsb->build_time); sbi->build_time_nsec = le32_to_cpu(dsb->build_time_nsec); |