com php-src: improve fix for bug #71201: ext/standard/math.c
| From: | Anatol Belski | Date: | Tue, 19 Jan 2016 23:49:05 +0000 |
| Subject: | com php-src: improve fix for bug #71201: ext/standard/math.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-90706@lists.php.net to get a copy of this message | ||
Commit: a6801092abb0fc72892177c3f96ab5f795759f35
Author: Anatol Belski <ab@php.net> Wed, 20 Jan 2016 09:46:09 +0100
Parents: f7e6ff99d7633da3ab3cfa4e80e879a31ee8ab29
Branches: PHP-7.0.3
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=a6801092abb0fc72892177c3f96ab5f795759f35
Log:
improve fix for bug #71201
Bugs:
https://bugs.php.net/71201
Changed paths:
M ext/standard/math.c
Diff:
diff --git a/ext/standard/math.c b/ext/standard/math.c
index 7ea8dc1..ebfee8e 100644
--- a/ext/standard/math.c
+++ b/ext/standard/math.c
@@ -146,6 +146,7 @@ PHPAPI double _php_math_round(double value, int places, int mode) {
return value;
}
+ places = places < INT_MIN+1 ? INT_MIN+1 : places;
precision_places = 14 - php_intlog10abs(value);
f1 = php_intpow10(abs(places));
@@ -154,8 +155,10 @@ PHPAPI double _php_math_round(double value, int places, int mode) {
the requested places BUT is small enough to make sure a non-zero value
is returned, pre-round the result to the precision */
if (precision_places > places && precision_places - places < 15) {
- f2 = php_intpow10(abs(precision_places));
- if (precision_places >= 0) {
+ int64_t use_precision = precision_places < INT_MIN+1 ? INT_MIN+1 : precision_places;
+
+ f2 = php_intpow10(abs((int)use_precision));
+ if (use_precision >= 0) {
tmp_value = value * f2;
} else {
tmp_value = value / f2;
@@ -163,8 +166,11 @@ PHPAPI double _php_math_round(double value, int places, int mode) {
/* preround the result (tmp_value will always be something * 1e14,
thus never larger than 1e15 here) */
tmp_value = php_round_helper(tmp_value, mode);
+
+ use_precision = places - precision_places;
+ use_precision = use_precision < INT_MIN+1 ? INT_MIN+1 : use_precision;
/* now correctly move the decimal point */
- f2 = php_intpow10(abs(places - precision_places));
+ f2 = php_intpow10(abs((int)use_precision));
/* because places < precision_places */
tmp_value = tmp_value / f2;
} else {