Add checks to make sure inode counts don't overflow a 32-bit value

Signed-off-by: Eric Sandeen <esandeen@redhat.com>
bitmap-optimize
Eric Sandeen 2006-09-12 14:56:17 -04:00 committed by Theodore Ts'o
parent abf23439d5
commit f335864338
8 changed files with 46 additions and 4 deletions

View File

@ -1,3 +1,7 @@
2006-08-30 Eric Sandeen <esandeen@redhat.com>
* unix.c (show_stats): use ext2_ino_t for inode containers.
2006-08-30 Eric Sandeen <esandeen@redhat.com> 2006-08-30 Eric Sandeen <esandeen@redhat.com>
* pass1.c (new_table_block, handle_fs_bad_blocks): * pass1.c (new_table_block, handle_fs_bad_blocks):

View File

@ -98,7 +98,7 @@ static void usage(e2fsck_t ctx)
static void show_stats(e2fsck_t ctx) static void show_stats(e2fsck_t ctx)
{ {
ext2_filsys fs = ctx->fs; ext2_filsys fs = ctx->fs;
__u32 inodes, inodes_used; ext2_ino_t inodes, inodes_used;
blk_t blocks, blocks_used; blk_t blocks, blocks_used;
int dir_links; int dir_links;
int num_files, num_links; int num_files, num_links;

View File

@ -1,3 +1,8 @@
2006-08-30 Eric Sandeen <esandeen@redhat.com>
* initialize.c (ext2fs_initialize): Make sure inode count does
not overflow 32 bits.
2006-08-30 Eric Sandeen <esandeen@redhat.com> 2006-08-30 Eric Sandeen <esandeen@redhat.com>
* alloc_tables.c (ext2fs_allocate_group_table): * alloc_tables.c (ext2fs_allocate_group_table):

View File

@ -246,9 +246,8 @@ retry:
if (ipg > (unsigned) EXT2_MAX_INODES_PER_GROUP(super)) if (ipg > (unsigned) EXT2_MAX_INODES_PER_GROUP(super))
ipg = EXT2_MAX_INODES_PER_GROUP(super); ipg = EXT2_MAX_INODES_PER_GROUP(super);
ipg_retry:
super->s_inodes_per_group = ipg; super->s_inodes_per_group = ipg;
if (super->s_inodes_count > ipg * fs->group_desc_count)
super->s_inodes_count = ipg * fs->group_desc_count;
/* /*
* Make sure the number of inodes per group completely fills * Make sure the number of inodes per group completely fills
@ -276,6 +275,10 @@ retry:
/* /*
* adjust inode count to reflect the adjusted inodes_per_group * adjust inode count to reflect the adjusted inodes_per_group
*/ */
if ((__u64)super->s_inodes_per_group * fs->group_desc_count > ~0U) {
ipg--;
goto ipg_retry;
}
super->s_inodes_count = super->s_inodes_per_group * super->s_inodes_count = super->s_inodes_per_group *
fs->group_desc_count; fs->group_desc_count;
super->s_free_inodes_count = super->s_inodes_count; super->s_free_inodes_count = super->s_inodes_count;

View File

@ -1,3 +1,7 @@
2006-08-30 Eric Sandeen <esandeen@redhat.com>
* mke2fs.c (PRS): Disallow > 2^32 inodes at mkfs time.
2006-08-30 Eric Sandeen <esandeen@redhat.com> 2006-08-30 Eric Sandeen <esandeen@redhat.com>
* dumpe2fs.c (list_desc): Use new inlines to calculate group * dumpe2fs.c (list_desc): Use new inlines to calculate group

View File

@ -896,7 +896,7 @@ static void PRS(int argc, char *argv[])
double reserved_ratio = 5.0; double reserved_ratio = 5.0;
int sector_size = 0; int sector_size = 0;
int show_version_only = 0; int show_version_only = 0;
ext2_ino_t num_inodes = 0; __u64 num_inodes = 0; /* u64 to catch too-large input */
errcode_t retval; errcode_t retval;
char * oldpath = getenv("PATH"); char * oldpath = getenv("PATH");
char * extended_opts = 0; char * extended_opts = 0;
@ -1437,6 +1437,21 @@ static void PRS(int argc, char *argv[])
fs_param.s_inode_size = inode_size; fs_param.s_inode_size = inode_size;
} }
/* Make sure number of inodes specified will fit in 32 bits */
if (num_inodes == 0) {
__u64 n;
n = (__u64) fs_param.s_blocks_count * blocksize / inode_ratio;
if (n > ~0U) {
com_err(program_name, 0,
_("too many inodes (%llu), raise inode ratio?"), n);
exit(1);
}
} else if (num_inodes > ~0U) {
com_err(program_name, 0,
_("too many inodes (%llu), specify < 2^32 inodes"),
(__u64)num_inodes);
exit(1);
}
/* /*
* Calculate number of inodes based on the inode ratio * Calculate number of inodes based on the inode ratio
*/ */

View File

@ -1,3 +1,7 @@
2006-08-30 Eric Sandeen <esandeen@redhat.com>
* resize2fs.c (adjust_fs_info): Disallow > 2^32 indoes at resize time.
2006-08-30 Eric Sandeen <esandeen@redhat.com> 2006-08-30 Eric Sandeen <esandeen@redhat.com>
* online.c (online_resize_fs): Fix printf formats. * online.c (online_resize_fs): Fix printf formats.

View File

@ -186,6 +186,7 @@ errcode_t adjust_fs_info(ext2_filsys fs, ext2_filsys old_fs, blk_t new_size)
unsigned long i, j, old_desc_blocks, max_group; unsigned long i, j, old_desc_blocks, max_group;
unsigned int meta_bg, meta_bg_size; unsigned int meta_bg, meta_bg_size;
int has_super; int has_super;
__u64 new_inodes; /* u64 to check for overflow */
fs->super->s_blocks_count = new_size; fs->super->s_blocks_count = new_size;
@ -226,6 +227,12 @@ retry:
/* /*
* Adjust the number of inodes * Adjust the number of inodes
*/ */
new_inodes =(__u64)fs->super->s_inodes_per_group * fs->group_desc_count;
if (new_inodes > ~0U) {
fprintf(stderr, _("inodes (%llu) must be less than %u"),
new_inodes, ~0U);
return EXT2_ET_TOO_MANY_INODES;
}
fs->super->s_inodes_count = fs->super->s_inodes_per_group * fs->super->s_inodes_count = fs->super->s_inodes_per_group *
fs->group_desc_count; fs->group_desc_count;