diff --git a/NEWS b/NEWS index ce47d11ef0ab6..9776998e35eec 100644 --- a/NEWS +++ b/NEWS @@ -12,5 +12,6 @@ Standard: . Implement GH-12188 (Indication for the int size in phpinfo()). (timwolla) . Partly fix GH-12143 (Incorrect round() result for 0.49999999999999994). (timwolla) + . Fix GH-12252 (round(): Validate the rounding mode). (timwolla) <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/UPGRADING b/UPGRADING index 1dfb256097d2c..e354de6043e51 100644 --- a/UPGRADING +++ b/UPGRADING @@ -58,6 +58,9 @@ PHP 8.4 UPGRADE NOTES would have resulted in 1.0 instead of the correct result 0.0. Additional inputs might also be affected and result in different outputs compared to earlier PHP versions. + . round() now validates the value of the $mode parameter and throws a ValueError + for invalid modes. Previously invalid modes would have been interpreted as + PHP_ROUND_HALF_UP. ======================================== 6. New Functions diff --git a/ext/standard/math.c b/ext/standard/math.c index 05f2252e304e8..6b16b0755f69b 100644 --- a/ext/standard/math.c +++ b/ext/standard/math.c @@ -335,6 +335,17 @@ PHP_FUNCTION(round) } } + switch (mode) { + case PHP_ROUND_HALF_UP: + case PHP_ROUND_HALF_DOWN: + case PHP_ROUND_HALF_EVEN: + case PHP_ROUND_HALF_ODD: + break; + default: + zend_argument_value_error(3, "must be a valid rounding mode (PHP_ROUND_*)"); + RETURN_THROWS(); + } + switch (Z_TYPE_P(value)) { case IS_LONG: /* Simple case - long that doesn't need to be rounded. */ diff --git a/ext/standard/tests/math/round_valid_rounding_mode.phpt b/ext/standard/tests/math/round_valid_rounding_mode.phpt new file mode 100644 index 0000000000000..d61bc6356e1e6 --- /dev/null +++ b/ext/standard/tests/math/round_valid_rounding_mode.phpt @@ -0,0 +1,12 @@ +--TEST-- +round() rejects invalid rounding modes. +--FILE-- +getMessage(), PHP_EOL; +} +?> +--EXPECT-- +round(): Argument #3 ($mode) must be a valid rounding mode (PHP_ROUND_*)