aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2021-02-25 21:40:27 -0500
committerTheodore Ts'o <tytso@mit.edu>2021-02-25 21:40:27 -0500
commitbb2349c518bd6d59edac4148e4cd3373731b1d27 (patch)
treee38c4ecf01182d7477f26c76ad6dd04b1bf19fc1
parent37c2008f1356ba64132514346c1916f7ecc83ddb (diff)
downloade2fsprogs-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.c12
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);