Whamcloud - gitweb
resize2fs: fix 32-bit overflow issue which can corrupt 64-bit file systems
authorTheodore Ts'o <tytso@mit.edu>
Thu, 3 Jan 2013 04:31:04 +0000 (23:31 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 3 Jan 2013 13:38:45 +0000 (08:38 -0500)
Fix a 32-bit overflow bug caused by a missing blk64_t cast which can
cause the block bitmap to get corrupted when doing an off-line resize
of a 64-bit file system.

This problem can be reproduced as follows:

rm -f foo.img; touch foo.img
truncate -s 8T foo.img
mke2fs -F -t ext4 -O 64bit foo.img
e2fsck -f foo.img
truncate -s 21T foo.img
resize2fs foo.img
e2fsck -fy foo.img

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

index 092cfbd..0407e41 100644 (file)
@@ -197,8 +197,7 @@ static void fix_uninit_block_bitmaps(ext2_filsys fs)
                if (!(ext2fs_bg_flags_test(fs, g, EXT2_BG_BLOCK_UNINIT)))
                        continue;
 
-               blk = (g * fs->super->s_blocks_per_group) +
-                       fs->super->s_first_data_block;
+               blk = ext2fs_group_first_block2(fs, g);
 
                ext2fs_super_and_bgd_loc2(fs, g, &super_blk,
                                          &old_desc_blk, &new_desc_blk, 0);
@@ -846,8 +845,7 @@ static errcode_t blocks_to_move(ext2_resize_t rfs)
                         * The block bitmap is uninitialized, so skip
                         * to the next block group.
                         */
-                       blk = ((g+1) * fs->super->s_blocks_per_group) +
-                               fs->super->s_first_data_block - 1;
+                       blk = ext2fs_group_first_block2(fs, g+1) - 1;
                        continue;
                }
                if (ext2fs_test_block_bitmap2(old_fs->block_map, blk) &&