From ef059870afc5b3ace4dfbf65d6f1ffe6b610484d Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Tue, 17 Apr 2001 00:40:02 +0000 Subject: [PATCH] ChangeLog, super.c: super.c (check_super_block): Fix bad calculation of inodes_per_block, and tighten min/max checks to be a bit more paranoid. Thanks to Andreas Dilger for pointing out this bug. --- e2fsck/ChangeLog | 7 +++++++ e2fsck/super.c | 14 +++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog index 93f8116..a9b3f08 100644 --- a/e2fsck/ChangeLog +++ b/e2fsck/ChangeLog @@ -1,3 +1,10 @@ +2001-04-16 Theodore Tso + + * super.c (check_super_block): Fix bad calculation of + inodes_per_block, and tighten min/max checks to be a bit + more paranoid. Thanks to Andreas Dilger for pointing out + this bug. + 2001-03-29 Theodore Tso * journal.c (mark_buffer_uptodate): Add emulation of kernel diff --git a/e2fsck/super.c b/e2fsck/super.c index 352a6b4..56fc228 100644 --- a/e2fsck/super.c +++ b/e2fsck/super.c @@ -300,9 +300,8 @@ void check_super_block(e2fsck_t ctx) blk_t should_be; struct problem_context pctx; - inodes_per_block = (EXT2_INODE_SIZE(fs->super) + - EXT2_BLOCK_SIZE(fs->super) - 1) / - EXT2_BLOCK_SIZE(fs->super); + inodes_per_block = (EXT2_BLOCK_SIZE(fs->super) / + EXT2_INODE_SIZE(fs->super)); ctx->invalid_inode_bitmap_flag = (int *) e2fsck_allocate_memory(ctx, sizeof(int) * fs->group_desc_count, "invalid_inode_bitmap"); @@ -328,12 +327,13 @@ void check_super_block(e2fsck_t ctx) MIN_CHECK | MAX_CHECK, sb->s_log_frag_size, 2); check_super_value(ctx, "frags_per_group", sb->s_frags_per_group, - MIN_CHECK | MAX_CHECK, 1, 8 * EXT2_BLOCK_SIZE(sb)); + MIN_CHECK | MAX_CHECK, sb->s_blocks_per_group, + 8 * EXT2_BLOCK_SIZE(sb)); check_super_value(ctx, "blocks_per_group", sb->s_blocks_per_group, - MIN_CHECK | MAX_CHECK, 1, 8 * EXT2_BLOCK_SIZE(sb)); + MIN_CHECK | MAX_CHECK, 8, 8 * EXT2_BLOCK_SIZE(sb)); check_super_value(ctx, "inodes_per_group", sb->s_inodes_per_group, - MIN_CHECK | MAX_CHECK, 1, - inodes_per_block * blocks_per_group); + MIN_CHECK | MAX_CHECK, inodes_per_block, + inodes_per_block * (blocks_per_group-4)); check_super_value(ctx, "r_blocks_count", sb->s_r_blocks_count, MAX_CHECK, 0, sb->s_blocks_count); -- 1.8.3.1