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>
+
* pass1.c (new_table_block, handle_fs_bad_blocks):
* super.c (check_super_block):
Use new inlines to calculate group first & last blocks.
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;
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>
+
* alloc_tables.c (ext2fs_allocate_group_table):
* check_desc.c (ext2fs_check_desc):
Use new inlines to calculate group first & last blocks.
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
/*
* 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;
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>
+
* dumpe2fs.c (list_desc): Use new inlines to calculate group
first & last blocks.
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;
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
*/
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>
+
* online.c (online_resize_fs): Fix printf formats.
2006-08-30 Eric Sandeen <esandeen@redhat.com>
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;
/*
* 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;