Commit 0d2d35312b5 for php.net
commit 0d2d35312b5fb7a8863c3442b530d971caa9c71b
Merge: d89f14bde2e 16e217ee550
Author: Saki Takamachi <saki@php.net>
Date: Sun Jun 7 12:19:57 2026 +0900
Merge branch 'PHP-8.5'
* PHP-8.5:
ext/bcmath: bounds-check $precision in bcround() and Number::round() (#22182)
diff --cc ext/bcmath/bcmath.c
index 2e2d80f76f9,69ee1c68133..0e0a9a23b94
--- a/ext/bcmath/bcmath.c
+++ b/ext/bcmath/bcmath.c
@@@ -792,18 -805,26 +802,22 @@@ PHP_FUNCTION(bcround
Z_PARAM_STR(numstr)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(precision)
- Z_PARAM_OBJ_OF_CLASS(mode_object, rounding_mode_ce)
+ Z_PARAM_ENUM(rounding_mode, rounding_mode_ce)
ZEND_PARSE_PARAMETERS_END();
+ if (bcmath_check_precision(precision, 2) == FAILURE) {
+ RETURN_THROWS();
+ }
+
- if (mode_object != NULL) {
- mode = php_math_round_mode_from_enum(mode_object);
- }
-
- switch (mode) {
- case PHP_ROUND_HALF_UP:
- case PHP_ROUND_HALF_DOWN:
- case PHP_ROUND_HALF_EVEN:
- case PHP_ROUND_HALF_ODD:
- case PHP_ROUND_CEILING:
- case PHP_ROUND_FLOOR:
- case PHP_ROUND_TOWARD_ZERO:
- case PHP_ROUND_AWAY_FROM_ZERO:
+ switch (rounding_mode) {
+ case ZEND_ENUM_RoundingMode_HalfAwayFromZero:
+ case ZEND_ENUM_RoundingMode_HalfTowardsZero:
+ case ZEND_ENUM_RoundingMode_HalfEven:
+ case ZEND_ENUM_RoundingMode_HalfOdd:
+ case ZEND_ENUM_RoundingMode_TowardsZero:
+ case ZEND_ENUM_RoundingMode_AwayFromZero:
+ case ZEND_ENUM_RoundingMode_NegativeInfinity:
+ case ZEND_ENUM_RoundingMode_PositiveInfinity:
break;
default:
/* This is currently unreachable, but might become reachable when new modes are added. */
@@@ -1791,21 -1816,28 +1805,25 @@@ PHP_METHOD(BcMath_Number, round
ZEND_PARSE_PARAMETERS_START(0, 2)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(precision);
- Z_PARAM_OBJ_OF_CLASS(mode_object, rounding_mode_ce);
+ Z_PARAM_ENUM(rounding_mode, rounding_mode_ce);
ZEND_PARSE_PARAMETERS_END();
+ if (bcmath_check_precision(precision, 1) == FAILURE) {
+ RETURN_THROWS();
+ }
+
- if (mode_object != NULL) {
- rounding_mode = php_math_round_mode_from_enum(mode_object);
- }
-
switch (rounding_mode) {
- case PHP_ROUND_HALF_UP:
- case PHP_ROUND_HALF_DOWN:
- case PHP_ROUND_HALF_EVEN:
- case PHP_ROUND_HALF_ODD:
- case PHP_ROUND_CEILING:
- case PHP_ROUND_FLOOR:
- case PHP_ROUND_TOWARD_ZERO:
- case PHP_ROUND_AWAY_FROM_ZERO:
+ case ZEND_ENUM_RoundingMode_HalfAwayFromZero:
+ case ZEND_ENUM_RoundingMode_HalfTowardsZero:
+ case ZEND_ENUM_RoundingMode_HalfEven:
+ case ZEND_ENUM_RoundingMode_HalfOdd:
+ case ZEND_ENUM_RoundingMode_TowardsZero:
+ case ZEND_ENUM_RoundingMode_AwayFromZero:
+ case ZEND_ENUM_RoundingMode_NegativeInfinity:
+ case ZEND_ENUM_RoundingMode_PositiveInfinity:
break;
default:
+ /* This is currently unreachable, but might become reachable when new modes are added. */
zend_argument_value_error(2, "is an unsupported rounding mode");
RETURN_THROWS();
}