[PATCH 4/4] - e2fsprogs - fix up more arithmetic overflows
Eric Sandeen <[email protected]> Fri, 25 Aug 2006 17:05:04 -0500
| Newsgroups | gmane.comp.file-systems.ext2.devel |
|---|---|
| Message-ID | <[email protected]> |
Fix up more calculations where the arithmetic could overflow. These are mostly ones Takashi had found and I'd missed. Signed-off-by: Eric Sandeen <[email protected]> Index: e2fsprogs-1.39-16T-2/lib/ext2fs/initialize.c =================================================================== --- e2fsprogs-1.39-16T-2.orig/lib/ext2fs/initialize.c +++ e2fsprogs-1.39-16T-2/lib/ext2fs/initialize.c @@ -77,7 +77,7 @@ static unsigned int calc_reserved_gdt_bl */ if (sb->s_blocks_count < max_blocks / 1024) max_blocks = sb->s_blocks_count * 1024; - rsv_groups = (max_blocks - sb->s_first_data_block + bpg - 1) / bpg; + rsv_groups = ((max_blocks - sb->s_first_data_block - 1) / bpg) + 1; rsv_gdb = (rsv_groups + gdpb - 1) / gdpb - fs->desc_blocks; if (rsv_gdb > EXT2_ADDR_PER_BLOCK(sb)) rsv_gdb = EXT2_ADDR_PER_BLOCK(sb); Index: e2fsprogs-1.39-16T-2/misc/mke2fs.c =================================================================== --- e2fsprogs-1.39-16T-2.orig/misc/mke2fs.c +++ e2fsprogs-1.39-16T-2/misc/mke2fs.c @@ -823,7 +823,7 @@ static void parse_extended_opts(struct e / bpg) + 1; desc_blocks = (group_desc_count + gdpb - 1) / gdpb; - rsv_groups = (resize + bpg - 1) / bpg; + rsv_groups = ((resize - 1) / bpg) + 1; rsv_gdb = (rsv_groups + gdpb - 1) / gdpb - desc_blocks; if (rsv_gdb > (int) EXT2_ADDR_PER_BLOCK(param)) @@ -1261,7 +1261,7 @@ static void PRS(int argc, char *argv[]) } if (!fs_type) { - int megs = fs_param.s_blocks_count * + int megs = (__u64)fs_param.s_blocks_count * (EXT2_BLOCK_SIZE(&fs_param) / 1024) / 1024; if (megs <= 3) @@ -1455,7 +1455,7 @@ static void PRS(int argc, char *argv[]) /* * Calculate number of blocks to reserve */ - fs_param.s_r_blocks_count = (fs_param.s_blocks_count * reserved_ratio) + fs_param.s_r_blocks_count = ((__u64)fs_param.s_blocks_count * reserved_ratio) / 100; } Index: e2fsprogs-1.39-16T-2/misc/tune2fs.c =================================================================== --- e2fsprogs-1.39-16T-2.orig/misc/tune2fs.c +++ e2fsprogs-1.39-16T-2/misc/tune2fs.c @@ -823,7 +823,7 @@ int main (int argc, char ** argv) printf (_("Setting interval between checks to %lu seconds\n"), interval); } if (m_flag) { - sb->s_r_blocks_count = sb->s_blocks_count * reserved_ratio /100; + sb->s_r_blocks_count = (__u64)sb->s_blocks_count * reserved_ratio / 100; ext2fs_mark_super_dirty(fs); printf (_("Setting reserved blocks percentage to %g%% (%u blocks)\n"), reserved_ratio, sb->s_r_blocks_count); Index: e2fsprogs-1.39-16T-2/resize/online.c =================================================================== --- e2fsprogs-1.39-16T-2.orig/resize/online.c +++ e2fsprogs-1.39-16T-2/resize/online.c @@ -59,8 +59,7 @@ errcode_t online_resize_fs(ext2_filsys f exit(1); } - r_frac = ((100 * sb->s_r_blocks_count) + sb->s_blocks_count-1) / - sb->s_blocks_count; + r_frac = (((100 * sb->s_r_blocks_count) - 1) / sb->s_blocks_count) + 1; retval = ext2fs_read_bitmaps(fs); if (retval) Index: e2fsprogs-1.39-16T-2/resize/resize2fs.c =================================================================== --- e2fsprogs-1.39-16T-2.orig/resize/resize2fs.c +++ e2fsprogs-1.39-16T-2/resize/resize2fs.c @@ -251,9 +251,9 @@ retry: /* * Adjust the number of reserved blocks */ - blk = old_fs->super->s_r_blocks_count * 100 / + blk = (__u64)old_fs->super->s_r_blocks_count * 100 / old_fs->super->s_blocks_count; - fs->super->s_r_blocks_count = ((fs->super->s_blocks_count / 100) + fs->super->s_r_blocks_count = (((__u64)fs->super->s_blocks_count / 100) * blk); /* Index: e2fsprogs-1.39-16T-2/misc/filefrag.c =================================================================== --- e2fsprogs-1.39-16T-2.orig/misc/filefrag.c +++ e2fsprogs-1.39-16T-2/misc/filefrag.c @@ -105,7 +105,7 @@ static void frag_report(const char *file if (verbose) { printf("Filesystem type is: %x\n", fsinfo.f_type); } - cylgroups = (fsinfo.f_blocks + fsinfo.f_bsize*8-1) / fsinfo.f_bsize*8; + cylgroups = ((fsinfo.f_blocks - 1) / (fsinfo.f_bsize * 8)) + 1; if (verbose) { printf("Filesystem cylinder groups is approximately %ld\n", cylgroups); Index: e2fsprogs-1.39-16T-2/e2fsck/pass1.c =================================================================== --- e2fsprogs-1.39-16T-2.orig/e2fsck/pass1.c +++ e2fsprogs-1.39-16T-2/e2fsck/pass1.c @@ -1953,7 +1953,7 @@ static void handle_fs_bad_blocks(e2fsck_ { ext2_filsys fs = ctx->fs; dgrp_t i; - int first_block; + blk_t first_block; for (i = 0; i < fs->group_desc_count; i++) { first_block = ext2fs_group_first_block(fs, i); ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642