]> granicus.if.org Git - php/commitdiff
- Fix array_sum to switch to float on overflow. Fixes bug#12505
authorJeroen van Wolffelaar <jeroen@php.net>
Fri, 3 Aug 2001 19:18:51 +0000 (19:18 +0000)
committerJeroen van Wolffelaar <jeroen@php.net>
Fri, 3 Aug 2001 19:18:51 +0000 (19:18 +0000)
ext/standard/array.c

index a12a95e1707281d8ed439f35abdcf0061f927691..3a85caeb63bc05f229ee40c0c6d8e739f15ad18f 100644 (file)
@@ -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);
        }
 }