From 9450cab0c2398871f026afcb56a3eab02ed78b40 Mon Sep 17 00:00:00 2001 From: Andreas Dilger Date: Tue, 4 Feb 2020 20:59:39 -0700 Subject: [PATCH] LU-13197 e2fsck: fix overflow if more than 4B inodes Even though we don't have support for filesystems with over 4B inodes in the current e2fsprogs, this may happen in the future. There are latent overflow bugs when calculating the number of inodes in the filesystem that may as well be fixed now, rather than waiting for it to be hit in the field at some point. Signed-off-by: Andreas Dilger Change-Id: I336ca04fe8f944dbfbe5425ce84e7d92743ebbe5 Reviewed-on: https://review.whamcloud.com/37440 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Wang Shilong Reviewed-by: Andreas Dilger --- e2fsck/pass5.c | 2 +- lib/ext2fs/bitmaps.c | 3 ++- lib/ext2fs/imager.c | 6 ++++-- misc/fuse2fs.c | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/e2fsck/pass5.c b/e2fsck/pass5.c index c800ef6..23a4746 100644 --- a/e2fsck/pass5.c +++ b/e2fsck/pass5.c @@ -878,7 +878,7 @@ static void check_inode_end(e2fsck_t ctx) clear_problem_context(&pctx); - end = EXT2_INODES_PER_GROUP(fs->super) * fs->group_desc_count; + end = (__u64)EXT2_INODES_PER_GROUP(fs->super) * fs->group_desc_count; pctx.errcode = ext2fs_fudge_inode_bitmap_end(fs->inode_map, end, &save_inodes_count); if (pctx.errcode) { diff --git a/lib/ext2fs/bitmaps.c b/lib/ext2fs/bitmaps.c index e25db2c..834a396 100644 --- a/lib/ext2fs/bitmaps.c +++ b/lib/ext2fs/bitmaps.c @@ -62,7 +62,8 @@ errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs, start = 1; end = fs->super->s_inodes_count; - real_end = (EXT2_INODES_PER_GROUP(fs->super) * fs->group_desc_count); + real_end = (__u64)EXT2_INODES_PER_GROUP(fs->super) * + fs->group_desc_count; /* Are we permitted to use new-style bitmaps? */ if (fs->flags & EXT2_FLAG_64BITS) diff --git a/lib/ext2fs/imager.c b/lib/ext2fs/imager.c index 3dc6f08..beb807a 100644 --- a/lib/ext2fs/imager.c +++ b/lib/ext2fs/imager.c @@ -342,7 +342,8 @@ errcode_t ext2fs_image_bitmap_write(ext2_filsys fs, int fd, int flags) } bmap = fs->inode_map; itr = 1; - cnt = EXT2_INODES_PER_GROUP(fs->super) * fs->group_desc_count; + cnt = (__u64)EXT2_INODES_PER_GROUP(fs->super) * + fs->group_desc_count; size = (EXT2_INODES_PER_GROUP(fs->super) / 8); } else { if (!fs->block_map) { @@ -417,7 +418,8 @@ errcode_t ext2fs_image_bitmap_read(ext2_filsys fs, int fd, int flags) } bmap = fs->inode_map; itr = 1; - cnt = EXT2_INODES_PER_GROUP(fs->super) * fs->group_desc_count; + cnt = (__u64)EXT2_INODES_PER_GROUP(fs->super) * + fs->group_desc_count; size = (EXT2_INODES_PER_GROUP(fs->super) / 8); } else { if (!fs->block_map) { diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c index 582f95b..b94d87e 100644 --- a/misc/fuse2fs.c +++ b/misc/fuse2fs.c @@ -2364,7 +2364,7 @@ static int op_statfs(const char *path EXT2FS_ATTR((unused)), overhead = 0; else overhead = fs->desc_blocks + - fs->group_desc_count * + (blk64_t)fs->group_desc_count * (fs->inode_blocks_per_group + 2); reserved = ext2fs_r_blocks_count(fs->super); if (!reserved) -- 1.8.3.1