| From cd6bb35bf7f6d7d922509bf50265383a0ceabe96 Mon Sep 17 00:00:00 2001 |
| From: Theodore Ts'o <tytso@mit.edu> |
| Date: Fri, 18 Nov 2016 13:28:30 -0500 |
| Subject: ext4: use more strict checks for inodes_per_block on mount |
| |
| From: Theodore Ts'o <tytso@mit.edu> |
| |
| commit cd6bb35bf7f6d7d922509bf50265383a0ceabe96 upstream. |
| |
| Centralize the checks for inodes_per_block and be more strict to make |
| sure the inodes_per_block_group can't end up being zero. |
| |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Reviewed-by: Andreas Dilger <adilger@dilger.ca> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/ext4/super.c | 15 ++++++--------- |
| 1 file changed, 6 insertions(+), 9 deletions(-) |
| |
| --- a/fs/ext4/super.c |
| +++ b/fs/ext4/super.c |
| @@ -3613,12 +3613,16 @@ static int ext4_fill_super(struct super_ |
| |
| sbi->s_blocks_per_group = le32_to_cpu(es->s_blocks_per_group); |
| sbi->s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group); |
| - if (EXT4_INODE_SIZE(sb) == 0 || EXT4_INODES_PER_GROUP(sb) == 0) |
| - goto cantfind_ext4; |
| |
| sbi->s_inodes_per_block = blocksize / EXT4_INODE_SIZE(sb); |
| if (sbi->s_inodes_per_block == 0) |
| goto cantfind_ext4; |
| + if (sbi->s_inodes_per_group < sbi->s_inodes_per_block || |
| + sbi->s_inodes_per_group > blocksize * 8) { |
| + ext4_msg(sb, KERN_ERR, "invalid inodes per group: %lu\n", |
| + sbi->s_blocks_per_group); |
| + goto failed_mount; |
| + } |
| sbi->s_itb_per_group = sbi->s_inodes_per_group / |
| sbi->s_inodes_per_block; |
| sbi->s_desc_per_block = blocksize / EXT4_DESC_SIZE(sb); |
| @@ -3701,13 +3705,6 @@ static int ext4_fill_super(struct super_ |
| } |
| sbi->s_cluster_ratio = clustersize / blocksize; |
| |
| - if (sbi->s_inodes_per_group > blocksize * 8) { |
| - ext4_msg(sb, KERN_ERR, |
| - "#inodes per group too big: %lu", |
| - sbi->s_inodes_per_group); |
| - goto failed_mount; |
| - } |
| - |
| /* Do we have standard group size of clustersize * 8 blocks ? */ |
| if (sbi->s_blocks_per_group == clustersize << 3) |
| set_opt2(sb, STD_GROUP_SIZE); |