Whamcloud - gitweb
Add checks to make sure inode counts don't overflow a 32-bit value
authorEric Sandeen <esandeen@redhat.com>
Tue, 12 Sep 2006 18:56:17 +0000 (14:56 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 12 Sep 2006 18:56:17 +0000 (14:56 -0400)
Signed-off-by: Eric Sandeen <esandeen@redhat.com>
e2fsck/ChangeLog
e2fsck/unix.c
lib/ext2fs/ChangeLog
lib/ext2fs/initialize.c
misc/ChangeLog
misc/mke2fs.c
resize/ChangeLog
resize/resize2fs.c

index e934899..94bdf2f 100644 (file)
@@ -1,5 +1,9 @@
 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.
index 6cd2dfe..7a617cf 100644 (file)
@@ -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;
index ddd6e9f..2ce8a6b 100644 (file)
@@ -1,5 +1,10 @@
 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.
index ed68b42..98351f8 100644 (file)
@@ -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;
index b53fce6..f59d471 100644 (file)
@@ -1,5 +1,9 @@
 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.
 
index 05ee9d8..256c813 100644 (file)
@@ -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
         */
index c0d95ff..b740df0 100644 (file)
@@ -1,5 +1,9 @@
 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>
index e9d0fb5..60180ab 100644 (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 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;