]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
e2fsck: fix overflow if more than 4B inodes
authorAndreas Dilger <adilger@whamcloud.com>
Fri, 7 Feb 2020 01:09:44 +0000 (18:09 -0700)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 29 Feb 2020 23:34:54 +0000 (18:34 -0500)
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 can trivially be fixed now, rather than waiting for
them to be hit at some point in the future.  The block number calcs
are already correct in this code.

Signed-off-by: Andreas Dilger <adilger@dilger.ca>
Lustre-bug-id: https://jira.whamcloud.com/browse/LU-13197
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
e2fsck/pass5.c
lib/ext2fs/bitmaps.c
lib/ext2fs/imager.c
misc/fuse2fs.c

index 3a5c88dad9f2b3ab716ebdba730b949de3201546..c1d45a5f14ed5e0725414a59c407ce4b8976b5ba 100644 (file)
@@ -842,7 +842,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) {
index e25db2c66f72efce54aa015f01ed344a988d7870..834a3962aaf4de470394f3205ca8bec2d7f20321 100644 (file)
@@ -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)
index ed0989adb000575ff34bd1625f794bc554c1fda9..b3ede9a868571e7d15c1ee235aca0c449fe6cd0c 100644 (file)
@@ -347,7 +347,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) {
@@ -422,7 +423,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) {
index 68ddddd3bed863fdbeedc93bba874f999afb65b2..f906ca8f1048f341bf22bfc3fb92fe1ed6915ff3 100644 (file)
@@ -2357,7 +2357,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)