[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