aboutsummaryrefslogtreecommitdiff
path: root/lib/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/super.c')
-rw-r--r--lib/super.c7
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);