summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/math.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/ext/standard/math.c b/ext/standard/math.c
index 62f6ea9cb2..e4b1160b75 100644
--- a/ext/standard/math.c
+++ b/ext/standard/math.c
@@ -1151,14 +1151,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);
}
@@ -1168,6 +1172,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;
}
}
@@ -1270,7 +1278,6 @@ PHP_FUNCTION(number_format)
break;
default:
WRONG_PARAM_COUNT;
- break;
}
}
/* }}} */