@@ -978,24 +978,33 @@ static zend_always_inline void bcmath_number_sub_internal(
978
978
bc_rm_trailing_zeros (* ret );
979
979
}
980
980
981
- static zend_always_inline void bcmath_number_mul_internal (
981
+ static zend_always_inline zend_result bcmath_number_mul_internal (
982
982
bc_num n1 , bc_num n2 , bc_num * ret ,
983
983
size_t n1_full_scale , size_t n2_full_scale , size_t * scale , bool auto_scale
984
984
) {
985
985
if (auto_scale ) {
986
- * scale = MIN (n1_full_scale + n2_full_scale , INT_MAX );
986
+ * scale = n1_full_scale + n2_full_scale ;
987
+ if (UNEXPECTED (* scale > INT_MAX )) {
988
+ zend_value_error ("scale of the result is too large" );
989
+ return FAILURE ;
990
+ }
987
991
}
988
992
* ret = bc_multiply (n1 , n2 , * scale );
989
993
(* ret )-> n_scale = MIN (* scale , (* ret )-> n_scale );
990
994
bc_rm_trailing_zeros (* ret );
995
+ return SUCCESS ;
991
996
}
992
997
993
998
static zend_always_inline zend_result bcmath_number_div_internal (
994
999
bc_num n1 , bc_num n2 , bc_num * ret ,
995
1000
size_t n1_full_scale , size_t * scale , bool auto_scale
996
1001
) {
997
1002
if (auto_scale ) {
998
- * scale = MIN (n1_full_scale + BC_MATH_NUMBER_EXPAND_SCALE , INT_MAX );
1003
+ * scale = n1_full_scale + BC_MATH_NUMBER_EXPAND_SCALE ;
1004
+ if (UNEXPECTED (* scale > INT_MAX )) {
1005
+ zend_value_error ("scale of the result is too large" );
1006
+ return FAILURE ;
1007
+ }
999
1008
}
1000
1009
if (!bc_divide (n1 , n2 , ret , * scale )) {
1001
1010
zend_throw_exception_ex (zend_ce_division_by_zero_error , 0 , "Division by zero" );
@@ -1044,10 +1053,15 @@ static zend_always_inline zend_result bcmath_number_pow_internal(
1044
1053
if (exponent > 0 ) {
1045
1054
* scale = n1_full_scale * exponent ;
1046
1055
if (UNEXPECTED (* scale > INT_MAX || * scale < n1_full_scale )) {
1047
- * scale = INT_MAX ;
1056
+ zend_value_error ("scale of the result is too large" );
1057
+ return FAILURE ;
1048
1058
}
1049
1059
} else if (exponent < 0 ) {
1050
- * scale = MIN (n1_full_scale + BC_MATH_NUMBER_EXPAND_SCALE , INT_MAX );
1060
+ * scale = n1_full_scale + BC_MATH_NUMBER_EXPAND_SCALE ;
1061
+ if (UNEXPECTED (* scale > INT_MAX )) {
1062
+ zend_value_error ("scale of the result is too large" );
1063
+ return FAILURE ;
1064
+ }
1051
1065
scale_expand = true;
1052
1066
} else {
1053
1067
* scale = 0 ;
@@ -1201,7 +1215,9 @@ static zend_result bcmath_number_do_operation(uint8_t opcode, zval *ret_val, zva
1201
1215
bcmath_number_sub_internal (n1 , n2 , & ret , n1_full_scale , n2_full_scale , & scale , true);
1202
1216
break ;
1203
1217
case ZEND_MUL :
1204
- bcmath_number_mul_internal (n1 , n2 , & ret , n1_full_scale , n2_full_scale , & scale , true);
1218
+ if (UNEXPECTED (bcmath_number_mul_internal (n1 , n2 , & ret , n1_full_scale , n2_full_scale , & scale , true) == FAILURE )) {
1219
+ goto fail ;
1220
+ }
1205
1221
break ;
1206
1222
case ZEND_DIV :
1207
1223
if (UNEXPECTED (bcmath_number_div_internal (n1 , n2 , & ret , n1_full_scale , & scale , true) == FAILURE )) {
@@ -1396,7 +1412,9 @@ static void bcmath_number_calc_method(INTERNAL_FUNCTION_PARAMETERS, uint8_t opco
1396
1412
bcmath_number_sub_internal (intern -> num , num , & ret , intern -> scale , num_full_scale , & scale , scale_is_null );
1397
1413
break ;
1398
1414
case ZEND_MUL :
1399
- bcmath_number_mul_internal (intern -> num , num , & ret , intern -> scale , num_full_scale , & scale , scale_is_null );
1415
+ if (UNEXPECTED (bcmath_number_mul_internal (intern -> num , num , & ret , intern -> scale , num_full_scale , & scale , scale_is_null ) == FAILURE )) {
1416
+ goto fail ;
1417
+ }
1400
1418
break ;
1401
1419
case ZEND_DIV :
1402
1420
if (UNEXPECTED (bcmath_number_div_internal (intern -> num , num , & ret , intern -> scale , & scale , scale_is_null ) == FAILURE )) {
@@ -1560,7 +1578,11 @@ PHP_METHOD(BcMath_Number, sqrt)
1560
1578
1561
1579
size_t scale ;
1562
1580
if (scale_is_null ) {
1563
- scale = MIN (intern -> scale + BC_MATH_NUMBER_EXPAND_SCALE , INT_MAX );
1581
+ scale = intern -> scale + BC_MATH_NUMBER_EXPAND_SCALE ;
1582
+ if (UNEXPECTED (scale > INT_MAX )) {
1583
+ zend_value_error ("scale of the result is too large" );
1584
+ RETURN_THROWS ();
1585
+ }
1564
1586
} else {
1565
1587
scale = scale_lval ;
1566
1588
}
0 commit comments