summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@php.net>2013-07-21 21:07:19 +0800
committerXinchen Hui <laruence@php.net>2013-07-21 21:07:19 +0800
commit3380de9774551964af976aa48328e7e6f9bd78ff (patch)
treea4ad712f31a2df0c84f01f75d19b745dcab69c9c
parentcc91fbe986c208c40b50af8154373693d4bd7c9b (diff)
downloadphp-git-3380de9774551964af976aa48328e7e6f9bd78ff.tar.gz
Fixed bug #65304 (Use of max int in array_sum)
-rw-r--r--NEWS1
-rw-r--r--ext/standard/array.c12
-rw-r--r--ext/standard/tests/array/bug65304.phpt10
3 files changed, 12 insertions, 11 deletions
diff --git a/NEWS b/NEWS
index 997a845edf..ae429c2df6 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ PHP NEWS
?? ??? 2013, PHP 5.4.19
- Core.
+ . Fixed bug #65304 (Use of max int in array_sum). (Laruence)
. Fixed bug #65291 (get_defined_constants() causes PHP to crash in a very
limited case). (Arpad)
. Improve fix for bug #63186 (compile failure on netbsd). (Matteo)
diff --git a/ext/standard/array.c b/ext/standard/array.c
index e218dc0e49..0eaca16618 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -4037,17 +4037,7 @@ PHP_FUNCTION(array_sum)
entry_n = **entry;
zval_copy_ctor(&entry_n);
convert_scalar_to_number(&entry_n TSRMLS_CC);
-
- if (Z_TYPE(entry_n) == IS_LONG && Z_TYPE_P(return_value) == IS_LONG) {
- dval = (double)Z_LVAL_P(return_value) + (double)Z_LVAL(entry_n);
- if ( (double)LONG_MIN <= dval && dval <= (double)LONG_MAX ) {
- Z_LVAL_P(return_value) += Z_LVAL(entry_n);
- continue;
- }
- }
- convert_to_double(return_value);
- convert_to_double(&entry_n);
- Z_DVAL_P(return_value) += Z_DVAL(entry_n);
+ fast_add_function(return_value, return_value, &entry_n TSRMLS_CC);
}
}
/* }}} */
diff --git a/ext/standard/tests/array/bug65304.phpt b/ext/standard/tests/array/bug65304.phpt
new file mode 100644
index 0000000000..e5c9dfc5e6
--- /dev/null
+++ b/ext/standard/tests/array/bug65304.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Bug #65304 (Use of max int in array_sum)
+--FILE--
+<?php
+var_dump(array_sum(array(PHP_INT_MAX, 1)));
+var_dump(PHP_INT_MAX + 1);
+?>
+--EXPECTF--
+float(%s)
+float(%s)