Whamcloud - gitweb
resize2fs: prevent block group descriptors from overflowing the first bg
authorTheodore Ts'o <tytso@mit.edu>
Fri, 2 Oct 2020 18:47:25 +0000 (14:47 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 2 Oct 2020 18:47:25 +0000 (14:47 -0400)
For 1k block file systems, resizing a file system larger than
1073610752 blocks will result in the size of the block group
descriptors to be so large that it will overlap with the backup
superblock in block group #1.   This problem can be reproduced via:

    mke2fs -t ext4 /tmp/foo.img 200M
    resize2fs /tmp/foo.img 1T
    e2fsck -f /tmp/foo.img

https://github.com/tytso/e2fsprogs/issues/50

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
resize/main.c

index a0c31c0..5e771d2 100644 (file)
@@ -269,6 +269,8 @@ int main (int argc, char ** argv)
        long            sysval;
        int             len, mount_flags;
        char            *mtpt, *undo_file = NULL;
+       dgrp_t          new_group_desc_count;
+       unsigned long   new_desc_blocks;
 
 #ifdef ENABLE_NLS
        setlocale(LC_MESSAGES, "");
@@ -528,6 +530,18 @@ int main (int argc, char ** argv)
                        exit(1);
                }
        }
+       new_group_desc_count = ext2fs_div64_ceil(new_size -
+                               fs->super->s_first_data_block,
+                                                EXT2_BLOCKS_PER_GROUP(fs->super));
+       new_desc_blocks = ext2fs_div_ceil(new_group_desc_count,
+                                         EXT2_DESC_PER_BLOCK(fs->super));
+       if ((new_desc_blocks + fs->super->s_first_data_block) >
+           EXT2_BLOCKS_PER_GROUP(fs->super)) {
+               com_err(program_name, 0,
+                       _("New size results in too many block group "
+                         "descriptors.\n"));
+               exit(1);
+       }
 
        if (!force && new_size < min_size) {
                com_err(program_name, 0,