1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Fixed GH-17275: Fixed the calculation logic of dividend scale (#17279)

Fixes #17275
Closes #17279
This commit is contained in:
Saki Takamachi
2024-12-27 21:36:26 +09:00
parent f4fb77ed61
commit ef036090d9
3 changed files with 26 additions and 4 deletions

2
NEWS
View File

@@ -8,6 +8,8 @@ PHP NEWS
(Saki Takamachi)
. Fixed bug GH-17064 (Correctly round rounding mode with zero edge case).
(Saki Takamachi)
. Fixed bug GH-17275 (Fixed the calculation logic of dividend scale).
(Saki Takamachi)
- Core:
. Fixed bug OSS-Fuzz #382922236 (Duplicate dynamic properties in hooked object

View File

@@ -427,6 +427,9 @@ bool bc_divide(bc_num numerator, bc_num divisor, bc_num *quot, size_t scale)
return true;
}
/* Length of numerator data that can be read */
size_t numerator_readable_len = numeratorend - numeratorptr + 1;
/* set scale to numerator */
if (numerator_scale > scale) {
size_t scale_diff = numerator_scale - scale;
@@ -434,7 +437,13 @@ bool bc_divide(bc_num numerator, bc_num divisor, bc_num *quot, size_t scale)
numerator_bottom_extension -= scale_diff;
} else {
numerator_bottom_extension = 0;
numeratorend -= scale_diff > numerator_top_extension ? scale_diff - numerator_top_extension : 0;
if (EXPECTED(numerator_readable_len > scale_diff)) {
numerator_readable_len -= scale_diff;
numeratorend -= scale_diff;
} else {
numerator_readable_len = 0;
numeratorend = numeratorptr;
}
}
numerator_top_extension = MIN(numerator_top_extension, scale);
} else {
@@ -442,9 +451,6 @@ bool bc_divide(bc_num numerator, bc_num divisor, bc_num *quot, size_t scale)
}
numerator_scale = scale;
/* Length of numerator data that can be read */
size_t numerator_readable_len = numeratorend - numeratorptr + 1;
if (divisor_len > numerator_readable_len + numerator_bottom_extension) {
*quot = bc_copy_num(BCG(_zero_));
return true;

View File

@@ -0,0 +1,14 @@
--TEST--
GH-17275 Incorrect result of bcdiv function
--EXTENSIONS--
bcmath
--FILE--
<?php
var_dump(
bcdiv('0.03772321', '9650.0', 8),
bcdiv('0.03772321', '9650.0', 9),
);
?>
--EXPECT--
string(10) "0.00000390"
string(11) "0.000003909"