From f335864338a6fbce8134a445ffdd0cdeb3f3f1bc Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Tue, 12 Sep 2006 14:56:17 -0400 Subject: [PATCH] Add checks to make sure inode counts don't overflow a 32-bit value Signed-off-by: Eric Sandeen --- e2fsck/ChangeLog | 4 ++++ e2fsck/unix.c | 2 +- lib/ext2fs/ChangeLog | 5 +++++ lib/ext2fs/initialize.c | 7 +++++-- misc/ChangeLog | 4 ++++ misc/mke2fs.c | 17 ++++++++++++++++- resize/ChangeLog | 4 ++++ resize/resize2fs.c | 7 +++++++ 8 files changed, 46 insertions(+), 4 deletions(-) diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog index e934899..94bdf2f 100644 --- a/e2fsck/ChangeLog +++ b/e2fsck/ChangeLog @@ -1,5 +1,9 @@ 2006-08-30 Eric Sandeen + * unix.c (show_stats): use ext2_ino_t for inode containers. + +2006-08-30 Eric Sandeen + * pass1.c (new_table_block, handle_fs_bad_blocks): * super.c (check_super_block): Use new inlines to calculate group first & last blocks. diff --git a/e2fsck/unix.c b/e2fsck/unix.c index 6cd2dfe..7a617cf 100644 --- a/e2fsck/unix.c +++ b/e2fsck/unix.c @@ -98,7 +98,7 @@ static void usage(e2fsck_t ctx) static void show_stats(e2fsck_t ctx) { ext2_filsys fs = ctx->fs; - __u32 inodes, inodes_used; + ext2_ino_t inodes, inodes_used; blk_t blocks, blocks_used; int dir_links; int num_files, num_links; diff --git a/lib/ext2fs/ChangeLog b/lib/ext2fs/ChangeLog index ddd6e9f..2ce8a6b 100644 --- a/lib/ext2fs/ChangeLog +++ b/lib/ext2fs/ChangeLog @@ -1,5 +1,10 @@ 2006-08-30 Eric Sandeen + * initialize.c (ext2fs_initialize): Make sure inode count does + not overflow 32 bits. + +2006-08-30 Eric Sandeen + * alloc_tables.c (ext2fs_allocate_group_table): * check_desc.c (ext2fs_check_desc): Use new inlines to calculate group first & last blocks. diff --git a/lib/ext2fs/initialize.c b/lib/ext2fs/initialize.c index ed68b42..98351f8 100644 --- a/lib/ext2fs/initialize.c +++ b/lib/ext2fs/initialize.c @@ -246,9 +246,8 @@ retry: if (ipg > (unsigned) EXT2_MAX_INODES_PER_GROUP(super)) ipg = EXT2_MAX_INODES_PER_GROUP(super); +ipg_retry: 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 @@ -276,6 +275,10 @@ retry: /* * 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 * fs->group_desc_count; super->s_free_inodes_count = super->s_inodes_count; diff --git a/misc/ChangeLog b/misc/ChangeLog index b53fce6..f59d471 100644 --- a/misc/ChangeLog +++ b/misc/ChangeLog @@ -1,5 +1,9 @@ 2006-08-30 Eric Sandeen + * mke2fs.c (PRS): Disallow > 2^32 inodes at mkfs time. + +2006-08-30 Eric Sandeen + * dumpe2fs.c (list_desc): Use new inlines to calculate group first & last blocks. diff --git a/misc/mke2fs.c b/misc/mke2fs.c index 05ee9d8..256c813 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -896,7 +896,7 @@ static void PRS(int argc, char *argv[]) double reserved_ratio = 5.0; int sector_size = 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; char * oldpath = getenv("PATH"); char * extended_opts = 0; @@ -1437,6 +1437,21 @@ static void PRS(int argc, char *argv[]) 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 */ diff --git a/resize/ChangeLog b/resize/ChangeLog index c0d95ff..b740df0 100644 --- a/resize/ChangeLog +++ b/resize/ChangeLog @@ -1,5 +1,9 @@ 2006-08-30 Eric Sandeen + * resize2fs.c (adjust_fs_info): Disallow > 2^32 indoes at resize time. + +2006-08-30 Eric Sandeen + * online.c (online_resize_fs): Fix printf formats. 2006-08-30 Eric Sandeen diff --git a/resize/resize2fs.c b/resize/resize2fs.c index e9d0fb5..60180ab 100644 --- a/resize/resize2fs.c +++ b/resize/resize2fs.c @@ -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 int meta_bg, meta_bg_size; int has_super; + __u64 new_inodes; /* u64 to check for overflow */ fs->super->s_blocks_count = new_size; @@ -226,6 +227,12 @@ retry: /* * 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->group_desc_count; -- 1.8.3.1