summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
authorJeroen van Wolffelaar <jeroen@php.net>2001-08-03 19:18:51 +0000
committerJeroen van Wolffelaar <jeroen@php.net>2001-08-03 19:18:51 +0000
commit49c16290f383e4c821b13b791022e14a00cc7f34 (patch)
treef50168624fd87a1d23e978e0fe7492106a3b648b /ext/standard/array.c
parent9db1d22659dcef2888450c41e826a9eb43b9a7b9 (diff)
downloadphp-git-49c16290f383e4c821b13b791022e14a00cc7f34.tar.gz
- Fix array_sum to switch to float on overflow. Fixes bug#12505
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index a12a95e170..3a85caeb63 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -2809,6 +2809,7 @@ PHP_FUNCTION(array_sum)
**entry;
int argc = ZEND_NUM_ARGS();
HashPosition pos;
+ double dval;
if (argc != 1 || zend_get_parameters_ex(argc, &input) == FAILURE) {
WRONG_PARAM_COUNT;
@@ -2833,12 +2834,15 @@ PHP_FUNCTION(array_sum)
convert_scalar_to_number(*entry TSRMLS_CC);
if (Z_TYPE_PP(entry) == IS_LONG && Z_TYPE_P(return_value) == IS_LONG) {
- Z_LVAL_P(return_value) += Z_LVAL_PP(entry);
- } else {
- convert_to_double(return_value);
- convert_to_double_ex(entry);
- Z_DVAL_P(return_value) += Z_DVAL_PP(entry);
+ dval = (double)Z_LVAL_P(return_value) + (double)Z_LVAL_PP(entry);
+ if ( (double)LONG_MIN <= dval && dval <= (double)LONG_MAX ) {
+ Z_LVAL_P(return_value) += Z_LVAL_PP(entry);
+ continue;
+ }
}
+ convert_to_double(return_value);
+ convert_to_double_ex(entry);
+ Z_DVAL_P(return_value) += Z_DVAL_PP(entry);
}
}