diff options
author | Theodore Ts'o <tytso@mit.edu> | 2021-02-25 21:40:27 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2021-02-25 21:40:27 -0500 |
commit | bb2349c518bd6d59edac4148e4cd3373731b1d27 (patch) | |
tree | e38c4ecf01182d7477f26c76ad6dd04b1bf19fc1 | |
parent | 37c2008f1356ba64132514346c1916f7ecc83ddb (diff) | |
download | e2fsprogs-bb2349c518bd6d59edac4148e4cd3373731b1d27.tar.gz |
resize2fs: prevent block bitmap warnings when doing extreme fs expansions
This commit fixes a bug where if a small file system is resized to
ridiculous sizes, such that the size of the resized block group
descriptor blocks exceed the original file system, and this would
result in resize2fs triggering a large number of scary warning
messages:
Illegal block number passed to ext2fs_test_block_bitmap #12440
for block bitmap for broken.img
This can be replicated via:
./misc/mke2fs broken.img -b 1024 -T default
truncate -s +1500G broken.img
./resize/resize2fs broken.img
Fortunately, aside from triggering these warning messages, the bug had
no other bad effects.
https://github.com/tytso/e2fsprogs/issues/60
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r-- | resize/resize2fs.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/resize/resize2fs.c b/resize/resize2fs.c index 5d2a85623..a0d08e5b8 100644 --- a/resize/resize2fs.c +++ b/resize/resize2fs.c @@ -1243,7 +1243,8 @@ static void mark_fs_metablock(ext2_resize_t rfs, * nothing other than standard metadata in use. */ return; - } else if (ext2fs_test_block_bitmap2(rfs->old_fs->block_map, blk) && + } else if (blk < ext2fs_blocks_count(rfs->old_fs->super) && + ext2fs_test_block_bitmap2(rfs->old_fs->block_map, blk) && !ext2fs_test_block_bitmap2(meta_bmap, blk)) { ext2fs_mark_block_bitmap2(rfs->move_blocks, blk); rfs->needed_blocks++; @@ -1510,7 +1511,8 @@ static errcode_t blocks_to_move(ext2_resize_t rfs) if (ext2fs_block_bitmap_loc(old_fs, i) != (blk = ext2fs_block_bitmap_loc(fs, i))) { ext2fs_block_alloc_stats2(fs, blk, +1); - if (ext2fs_test_block_bitmap2(old_fs->block_map, blk) && + if (blk < ext2fs_blocks_count(old_fs->super) && + ext2fs_test_block_bitmap2(old_fs->block_map, blk) && !ext2fs_test_block_bitmap2(meta_bmap, blk)) ext2fs_mark_block_bitmap2(rfs->move_blocks, blk); @@ -1518,7 +1520,8 @@ static errcode_t blocks_to_move(ext2_resize_t rfs) if (ext2fs_inode_bitmap_loc(old_fs, i) != (blk = ext2fs_inode_bitmap_loc(fs, i))) { ext2fs_block_alloc_stats2(fs, blk, +1); - if (ext2fs_test_block_bitmap2(old_fs->block_map, blk) && + if (blk < ext2fs_blocks_count(old_fs->super) && + ext2fs_test_block_bitmap2(old_fs->block_map, blk) && !ext2fs_test_block_bitmap2(meta_bmap, blk)) ext2fs_mark_block_bitmap2(rfs->move_blocks, blk); @@ -1544,7 +1547,8 @@ static errcode_t blocks_to_move(ext2_resize_t rfs) for (blk = ext2fs_inode_table_loc(fs, i), j=0; j < fs->inode_blocks_per_group ; j++, blk++) { ext2fs_block_alloc_stats2(fs, blk, +1); - if (ext2fs_test_block_bitmap2(old_fs->block_map, blk) && + if (blk < ext2fs_blocks_count(old_fs->super) && + ext2fs_test_block_bitmap2(old_fs->block_map, blk) && !ext2fs_test_block_bitmap2(meta_bmap, blk)) ext2fs_mark_block_bitmap2(rfs->move_blocks, blk); |