]> granicus.if.org Git - php/commitdiff
Revert "Fix for #73240 - Write out of bounds at number_format"
authorAnatol Belski <ab@php.net>
Wed, 12 Oct 2016 14:11:32 +0000 (16:11 +0200)
committerAnatol Belski <ab@php.net>
Thu, 13 Oct 2016 23:43:23 +0000 (01:43 +0200)
This reverts commit 01280f8deb837a61237a619cffa886d7f8c31963.

The fix is already merged by Stas.

(cherry picked from commit 80eb013a926fad18cb0da05c508f564da3c1d88c)

ext/standard/math.c

index 753656c56f70237866102f543c8e434203898196..83145a4dc9bc370a6cff083c83dd57563c0a1acf 100644 (file)
@@ -1139,14 +1139,18 @@ PHPAPI zend_string *_php_math_number_format_ex(double d, int dec, char *dec_poin
 
        /* calculate the length of the return buffer */
        if (dp) {
-               integral = (dp - ZSTR_VAL(tmpbuf));
+               integral = (int)(dp - ZSTR_VAL(tmpbuf));
        } else {
                /* no decimal point was found */
-               integral = ZSTR_LEN(tmpbuf);
+               integral = (int)ZSTR_LEN(tmpbuf);
        }
 
        /* allow for thousand separators */
        if (thousand_sep) {
+               if (integral + thousand_sep_len * ((integral-1) / 3) < integral) {
+                       /* overflow */
+                       php_error_docref(NULL, E_ERROR, "String overflow");
+               }
                integral += thousand_sep_len * ((integral-1) / 3);
        }
 
@@ -1156,6 +1160,10 @@ PHPAPI zend_string *_php_math_number_format_ex(double d, int dec, char *dec_poin
                reslen += dec;
 
                if (dec_point) {
+                       if (reslen + dec_point_len < dec_point_len) {
+                               /* overflow */
+                               php_error_docref(NULL, E_ERROR, "String overflow");
+                       }
                        reslen += dec_point_len;
                }
        }
@@ -1258,7 +1266,6 @@ PHP_FUNCTION(number_format)
                break;
        default:
                WRONG_PARAM_COUNT;
-               break;
        }
 }
 /* }}} */