diff options
author | Ilia Alshanetsky <iliaa@php.net> | 2007-04-19 23:21:22 +0000 |
---|---|---|
committer | Ilia Alshanetsky <iliaa@php.net> | 2007-04-19 23:21:22 +0000 |
commit | c34806e1455a8b28ff1df0850a05e204acbc2316 (patch) | |
tree | eef52486fbf8c12b71523a2b160584f58c90c796 | |
parent | 73da9ea31dc50b7dd87f42e64a75bafcb8295ef2 (diff) | |
download | php-git-c34806e1455a8b28ff1df0850a05e204acbc2316.tar.gz |
Fixed bug #41121 (range() overflow handling for large numbers on 32bit
machines).
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | ext/standard/array.c | 18 | ||||
-rw-r--r-- | ext/standard/tests/array/bug41121.phpt | 125 |
3 files changed, 136 insertions, 9 deletions
@@ -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) diff --git a/ext/standard/array.c b/ext/standard/array.c index 3ff80a12a3..1e868e0488 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -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 index 0000000000..4cd188ddca --- /dev/null +++ b/ext/standard/tests/array/bug41121.phpt @@ -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) +} |