]> granicus.if.org Git - php/commitdiff
Fixed bug #41121 (range() overflow handling for large numbers on 32bit
authorIlia Alshanetsky <iliaa@php.net>
Thu, 19 Apr 2007 23:21:22 +0000 (23:21 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Thu, 19 Apr 2007 23:21:22 +0000 (23:21 +0000)
machines).

NEWS
ext/standard/array.c
ext/standard/tests/array/bug41121.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 93e4f6cedb8180a8874341f5de240b042d3cd3ef..ffb020a58a7360d7d3f11b0f50bc020e65961d5e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,8 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? Apr 2007, PHP 5.2.2RC2
 - Upgraded SQLite 3 to version 3.3.16 (Ilia)
+- Fixed bug #41121 (range() overflow handling for large numbers on 32bit
+  machines). (Ilia)
 - Fixed bug #41109 (recursiveiterator.inc says "implements" Iterator instead of
   "extends"). (Marcus)
 - Fixed bug #41093 (magic_quotes_gpc ignores first arrays keys). (Arpad, Ilia)
index 3ff80a12a33d03e297da656b94316c163abb63d6..1e868e04884edba1c7543f4e3d0bc4a6e2dc28da 100644 (file)
@@ -1718,13 +1718,13 @@ double_str:
                        add_next_index_double(return_value, low);
                }
        } else {
-               int low, high;
+               double low, high;
                long lstep;
 long_str:
-               convert_to_long(zlow);
-               convert_to_long(zhigh);
-               low = Z_LVAL_P(zlow);
-               high = Z_LVAL_P(zhigh);
+               convert_to_double(zlow);
+               convert_to_double(zhigh);
+               low = Z_DVAL_P(zlow);
+               high = Z_DVAL_P(zhigh);
                lstep = (long) step;
                                
                if (low > high) {               /* Negative steps */
@@ -1733,18 +1733,18 @@ long_str:
                                goto err;
                        }
                        for (; low >= high; low -= lstep) {
-                               add_next_index_long(return_value, low);
+                               add_next_index_long(return_value, (long)low);
                        }       
-               } else if (high > low) {        /* Positive steps */
+               } else if (high > low) {        /* Positive steps */
                        if (high - low < lstep || lstep <= 0) {
                                err = 1;
                                goto err;
                        }
                        for (; low <= high; low += lstep) {
-                               add_next_index_long(return_value, low);
+                               add_next_index_long(return_value, (long)low);
                        }       
                } else {
-                       add_next_index_long(return_value, low);
+                       add_next_index_long(return_value, (long)low);
                }
        }
 err:
diff --git a/ext/standard/tests/array/bug41121.phpt b/ext/standard/tests/array/bug41121.phpt
new file mode 100644 (file)
index 0000000..4cd188d
--- /dev/null
@@ -0,0 +1,125 @@
+--TEST--
+Bug #41121 (range() overflow handling for large numbers on 32bit machines)
+--SKIPIF--
+--FILE--
+<?php
+
+// posotive steps
+var_dump(range(2147483400, 2147483600, 100));
+var_dump( range(2147483646, 2147483648, 1 ) );
+var_dump( range(2147483646, 2147483657, 1 ) );
+var_dump( range(2147483630, 2147483646, 5 ) );
+// negative steps  
+var_dump( range(-2147483645, -2147483648, 1 ) );
+var_dump( range(-2147483645, -2147483649, 1 ) );
+var_dump( range(-2147483630, -2147483646, 5 ) );
+
+// low > high
+var_dump(range(2147483647, 2147483645, 1 ));
+var_dump(range(2147483648, 2147483645, 1 ));
+
+?>
+--EXPECT--     
+array(3) {
+  [0]=>
+  int(2147483400)
+  [1]=>
+  int(2147483500)
+  [2]=>
+  int(2147483600)
+}
+array(3) {
+  [0]=>
+  float(2147483646)
+  [1]=>
+  float(2147483647)
+  [2]=>
+  float(2147483648)
+}
+array(12) {
+  [0]=>
+  float(2147483646)
+  [1]=>
+  float(2147483647)
+  [2]=>
+  float(2147483648)
+  [3]=>
+  float(2147483649)
+  [4]=>
+  float(2147483650)
+  [5]=>
+  float(2147483651)
+  [6]=>
+  float(2147483652)
+  [7]=>
+  float(2147483653)
+  [8]=>
+  float(2147483654)
+  [9]=>
+  float(2147483655)
+  [10]=>
+  float(2147483656)
+  [11]=>
+  float(2147483657)
+}
+array(4) {
+  [0]=>
+  int(2147483630)
+  [1]=>
+  int(2147483635)
+  [2]=>
+  int(2147483640)
+  [3]=>
+  int(2147483645)
+}
+array(4) {
+  [0]=>
+  float(-2147483645)
+  [1]=>
+  float(-2147483646)
+  [2]=>
+  float(-2147483647)
+  [3]=>
+  float(-2147483648)
+}
+array(5) {
+  [0]=>
+  float(-2147483645)
+  [1]=>
+  float(-2147483646)
+  [2]=>
+  float(-2147483647)
+  [3]=>
+  float(-2147483648)
+  [4]=>
+  float(-2147483649)
+}
+array(4) {
+  [0]=>
+  int(-2147483630)
+  [1]=>
+  int(-2147483635)
+  [2]=>
+  int(-2147483640)
+  [3]=>
+  int(-2147483645)
+}
+array(3) {
+  [0]=>
+  int(2147483647)
+  [1]=>
+  int(2147483646)
+  [2]=>
+  int(2147483645)
+}
+array(4) {
+  [0]=>
+  float(2147483648)
+  [1]=>
+  float(2147483647)
+  [2]=>
+  float(2147483646)
+  [3]=>
+  float(2147483645)
+}