Prevent undefined offset when formatBitrate is given a significantly large enough...
authorSam Reed <reedy@users.mediawiki.org>
Sat, 31 Dec 2011 22:53:50 +0000 (22:53 +0000)
committerSam Reed <reedy@users.mediawiki.org>
Sat, 31 Dec 2011 22:53:50 +0000 (22:53 +0000)
> echo $wgLang->formatBitrate( pow( 10, 27 ) );
PHP Notice:  Undefined offset: 9 in /home/reedy/mediawiki/trunk/phase3/languages/Language.php on line 3827
PHP Stack trace:
PHP   1. {main}() /home/reedy/mediawiki/trunk/phase3/maintenance/eval.php:0
PHP   2. eval() /home/reedy/mediawiki/trunk/phase3/maintenance/eval.php:82
PHP   3. Language->formatBitrate() /home/reedy/mediawiki/trunk/phase3/maintenance/eval.php(82) : eval()'d code:1

Notice: Undefined offset: 9 in /home/reedy/mediawiki/trunk/phase3/languages/Language.php on line 3827

Call Stack:
    0.0006     650736   1. {main}() /home/reedy/mediawiki/trunk/phase3/maintenance/eval.php:0
   61.6539   21593432   2. eval(''echo $wgLang->formatBitrate( pow( 10, 27 ) );;'') /home/reedy/mediawiki/trunk/phase3/maintenance/eval.php:82
   61.6540   21593512   3. Language->formatBitrate() /home/reedy/mediawiki/trunk/phase3/maintenance/eval.php(82) : eval()'d code:1

1bps

languages/Language.php
tests/phpunit/languages/LanguageTest.php

index af78845..7b8d8aa 100644 (file)
@@ -3819,6 +3819,14 @@ class Language {
                }
                $unitIndex = (int)floor( log10( $bps ) / 3 );
                $mantissa = $bps / pow( 1000, $unitIndex );
+
+               $maxIndex = count( $units ) - 1;
+
+               if ( $unitIndex  > $maxIndex ) {
+                       // Prevent code falling off end of $units array
+                       $mantissa *= ( $unitIndex - $maxIndex ) * 1000;
+                       $unitIndex = $maxIndex;
+               }
                if ( $mantissa < 10 ) {
                        $mantissa = round( $mantissa, 1 );
                } else {
index ba9cba1..207664e 100644 (file)
@@ -345,6 +345,11 @@ class LanguageTest extends MediaWikiTestCase {
                                "1Ybps",
                                "1 yottabit per second"
                        ),
+                       array(
+                               pow( 10, 27 ),
+                               "1,000Ybps",
+                               "1,000 yottabits per second"
+                       ),
                );
        }
 }