]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[monojob] Avoid overflow when calculating percentage progress
authorMichael Brown <mcb30@ipxe.org>
Sat, 26 Mar 2011 13:13:45 +0000 (13:13 +0000)
committerMichael Brown <mcb30@ipxe.org>
Sat, 26 Mar 2011 13:14:53 +0000 (13:14 +0000)
Normalise the progress figures to ensure that multiplication by 100
(to produce a percentage) cannot result in integer overflow.

Reported-by: Sven Dreyer <sven@dreyer-net.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/monojob.c

index 62e672a4c87a57e70567ca0bdec406d179dce2c1..7431f88a3a16333b3611784860dc1c00b80fb383 100644 (file)
@@ -62,6 +62,8 @@ int monojob_wait ( const char *string ) {
        int rc;
        unsigned long last_progress;
        unsigned long elapsed;
+       unsigned long completed;
+       unsigned long total;
        unsigned int percentage;
        int shown_percentage = 0;
 
@@ -85,9 +87,11 @@ int monojob_wait ( const char *string ) {
                        if ( shown_percentage )
                                printf ( "\b\b\b\b    \b\b\b\b" );
                        job_progress ( &monojob, &progress );
-                       if ( progress.total ) {
-                               percentage = ( ( 100 * progress.completed ) /
-                                              progress.total );
+                       /* Normalise progress figures to avoid overflow */
+                       completed = ( progress.completed / 128 );
+                       total = ( progress.total / 128 );
+                       if ( total ) {
+                               percentage = ( ( 100 * completed ) / total );
                                printf ( "%3d%%", percentage );
                                shown_percentage = 1;
                        } else {