Skip to content

Commit 549c657

Browse files
authored
Fix GH-11761: Bcmath numbers with trailing zeros (#11798)
1 parent 7273349 commit 549c657

File tree

5 files changed

+109
-52
lines changed

5 files changed

+109
-52
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ PHP NEWS
22
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
33
?? ??? ????, PHP 8.3.0beta2
44

5+
- Bcmath
6+
. Fixed GH-11761 (removing trailing zeros from numbers) (jorgsowa)
7+
58
- Core:
69
. Fixed oss-fuzz #60741 (Leak in open_basedir). (ilutov)
710

ext/bcmath/libbcmath/src/str2num.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ bool bc_str2num (bc_num *num, char *str, size_t scale)
4040
size_t digits, strscale;
4141
char *ptr, *nptr;
4242
bool zero_int = false;
43+
size_t trailing_zeros = 0;
4344

4445
/* Prepare num. */
4546
bc_free_num (num);
@@ -68,9 +69,19 @@ bool bc_str2num (bc_num *num, char *str, size_t scale)
6869
}
6970
/* digits after the decimal point */
7071
while (*ptr >= '0' && *ptr <= '9') {
72+
if (*ptr == '0') {
73+
trailing_zeros++;
74+
} else {
75+
trailing_zeros = 0;
76+
}
7177
ptr++;
7278
strscale++;
7379
}
80+
81+
if (trailing_zeros > 0) {
82+
/* Trailining zeros should not take part in the computation of the overall scale, as it is pointless. */
83+
strscale = strscale - trailing_zeros;
84+
}
7485
if ((*ptr != '\0') || (digits+strscale == 0)) {
7586
*num = bc_copy_num (BCG(_zero_));
7687
return *ptr == '\0';

ext/bcmath/tests/bcpow.phpt

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ require(__DIR__ . "/run_bcmath_tests_function.inc");
1010

1111
$exponents = ["15", "-15", "1", "-9", "0", "-0"];
1212
$baseNumbers = array_merge($exponents, [
13-
"0.00",
14-
"-0.00",
1513
"14.14",
1614
"-16.60",
1715
"0.15",
@@ -76,22 +74,6 @@ Number "-0" (scale 0)
7674
-0 ** 0 = 1
7775
-0 ** -0 = 1
7876

79-
Number "0.00" (scale 0)
80-
0.00 ** 15 = 0
81-
0.00 ** -15 = 0
82-
0.00 ** 1 = 0
83-
0.00 ** -9 = 0
84-
0.00 ** 0 = 1
85-
0.00 ** -0 = 1
86-
87-
Number "-0.00" (scale 0)
88-
-0.00 ** 15 = 0
89-
-0.00 ** -15 = 0
90-
-0.00 ** 1 = 0
91-
-0.00 ** -9 = 0
92-
-0.00 ** 0 = 1
93-
-0.00 ** -0 = 1
94-
9577
Number "14.14" (scale 0)
9678
14.14 ** 15 = 180609729388653367
9779
14.14 ** -15 = 0
@@ -220,22 +202,6 @@ Number "-0" (scale 10)
220202
-0 ** 0 = 1.0000000000
221203
-0 ** -0 = 1.0000000000
222204

223-
Number "0.00" (scale 10)
224-
0.00 ** 15 = 0.0000000000
225-
0.00 ** -15 = 0.0000000000
226-
0.00 ** 1 = 0.0000000000
227-
0.00 ** -9 = 0.0000000000
228-
0.00 ** 0 = 1.0000000000
229-
0.00 ** -0 = 1.0000000000
230-
231-
Number "-0.00" (scale 10)
232-
-0.00 ** 15 = 0.0000000000
233-
-0.00 ** -15 = 0.0000000000
234-
-0.00 ** 1 = 0.0000000000
235-
-0.00 ** -9 = 0.0000000000
236-
-0.00 ** 0 = 1.0000000000
237-
-0.00 ** -0 = 1.0000000000
238-
239205
Number "14.14" (scale 10)
240206
14.14 ** 15 = 180609729388653367.2586094856
241207
14.14 ** -15 = 0.0000000000

ext/bcmath/tests/bcpow_large_numbers.phpt

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ require(__DIR__ . "/run_bcmath_tests_function.inc");
1010

1111
$exponents = ["252", "-112"];
1212
$baseNumbers = array_merge($exponents, [
13-
"0.00",
14-
"-0.00",
1513
"14.14",
1614
"-16.60",
1715
"0.15",
@@ -36,14 +34,6 @@ Number "-112" (scale 0)
3634
-112 ** 252 = 2528958559509291693508169626548016243760525615786379976651267082288161074806837567146354242426675448089179587223689918667106749284121965637887934532709154725528081671334320643858146400820666287506930741579829377389324701928200642059190071982670723834096616484481264403390509754202256821825886418273918096647296731861068941003342202311747852949747419032091731983573265045376333262301085406296848909763397511959941544798830761308589095475080050282796818166220650002245272286955283850226653729461037771414650027776147456
3735
-112 ** -112 = 0
3836

39-
Number "0.00" (scale 0)
40-
0.00 ** 252 = 0
41-
0.00 ** -112 = 0
42-
43-
Number "-0.00" (scale 0)
44-
-0.00 ** 252 = 0
45-
-0.00 ** -112 = 0
46-
4737
Number "14.14" (scale 0)
4838
14.14 ** 252 = 81893830287657387446140079713887806093576884288543703328783802176508922753380870094003376900318176725198165627317176488631295332728458521626072637389422651709754634844150191850264235770478926203337416116264674564206565124289082609409927041547210316199545928823591027686585730497632744792533
4939
14.14 ** -112 = 0
@@ -92,14 +82,6 @@ Number "-112" (scale 10)
9282
-112 ** 252 = 2528958559509291693508169626548016243760525615786379976651267082288161074806837567146354242426675448089179587223689918667106749284121965637887934532709154725528081671334320643858146400820666287506930741579829377389324701928200642059190071982670723834096616484481264403390509754202256821825886418273918096647296731861068941003342202311747852949747419032091731983573265045376333262301085406296848909763397511959941544798830761308589095475080050282796818166220650002245272286955283850226653729461037771414650027776147456.0000000000
9383
-112 ** -112 = 0.0000000000
9484

95-
Number "0.00" (scale 10)
96-
0.00 ** 252 = 0.0000000000
97-
0.00 ** -112 = 0.0000000000
98-
99-
Number "-0.00" (scale 10)
100-
-0.00 ** 252 = 0.0000000000
101-
-0.00 ** -112 = 0.0000000000
102-
10385
Number "14.14" (scale 10)
10486
14.14 ** 252 = 81893830287657387446140079713887806093576884288543703328783802176508922753380870094003376900318176725198165627317176488631295332728458521626072637389422651709754634844150191850264235770478926203337416116264674564206565124289082609409927041547210316199545928823591027686585730497632744792533.0727815413
10587
14.14 ** -112 = 0.0000000000

ext/bcmath/tests/bcpow_zero.phpt

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
--TEST--
2+
bcpow() function with number zero
3+
--EXTENSIONS--
4+
bcmath
5+
--INI--
6+
bcmath.scale=0
7+
--FILE--
8+
<?php
9+
require(__DIR__ . "/run_bcmath_tests_function.inc");
10+
11+
$exponents = ["0", "-0", "1", "1128321638"];
12+
$baseNumbers = [
13+
"0.00",
14+
"-0.00",
15+
"0.000000000000000000000000",
16+
"-0.000000000000000000000000",
17+
"-0",
18+
"0",
19+
];
20+
21+
run_bcmath_tests($baseNumbers, $exponents, "**", bcpow(...));
22+
23+
?>
24+
--EXPECT--
25+
Number "0.00" (scale 0)
26+
0.00 ** 0 = 1
27+
0.00 ** -0 = 1
28+
0.00 ** 1 = 0
29+
0.00 ** 1128321638 = 0
30+
31+
Number "-0.00" (scale 0)
32+
-0.00 ** 0 = 1
33+
-0.00 ** -0 = 1
34+
-0.00 ** 1 = 0
35+
-0.00 ** 1128321638 = 0
36+
37+
Number "0.000000000000000000000000" (scale 0)
38+
0.000000000000000000000000 ** 0 = 1
39+
0.000000000000000000000000 ** -0 = 1
40+
0.000000000000000000000000 ** 1 = 0
41+
0.000000000000000000000000 ** 1128321638 = 0
42+
43+
Number "-0.000000000000000000000000" (scale 0)
44+
-0.000000000000000000000000 ** 0 = 1
45+
-0.000000000000000000000000 ** -0 = 1
46+
-0.000000000000000000000000 ** 1 = 0
47+
-0.000000000000000000000000 ** 1128321638 = 0
48+
49+
Number "-0" (scale 0)
50+
-0 ** 0 = 1
51+
-0 ** -0 = 1
52+
-0 ** 1 = 0
53+
-0 ** 1128321638 = 0
54+
55+
Number "0" (scale 0)
56+
0 ** 0 = 1
57+
0 ** -0 = 1
58+
0 ** 1 = 0
59+
0 ** 1128321638 = 0
60+
61+
Number "0.00" (scale 10)
62+
0.00 ** 0 = 1.0000000000
63+
0.00 ** -0 = 1.0000000000
64+
0.00 ** 1 = 0.0000000000
65+
0.00 ** 1128321638 = 0.0000000000
66+
67+
Number "-0.00" (scale 10)
68+
-0.00 ** 0 = 1.0000000000
69+
-0.00 ** -0 = 1.0000000000
70+
-0.00 ** 1 = 0.0000000000
71+
-0.00 ** 1128321638 = 0.0000000000
72+
73+
Number "0.000000000000000000000000" (scale 10)
74+
0.000000000000000000000000 ** 0 = 1.0000000000
75+
0.000000000000000000000000 ** -0 = 1.0000000000
76+
0.000000000000000000000000 ** 1 = 0.0000000000
77+
0.000000000000000000000000 ** 1128321638 = 0.0000000000
78+
79+
Number "-0.000000000000000000000000" (scale 10)
80+
-0.000000000000000000000000 ** 0 = 1.0000000000
81+
-0.000000000000000000000000 ** -0 = 1.0000000000
82+
-0.000000000000000000000000 ** 1 = 0.0000000000
83+
-0.000000000000000000000000 ** 1128321638 = 0.0000000000
84+
85+
Number "-0" (scale 10)
86+
-0 ** 0 = 1.0000000000
87+
-0 ** -0 = 1.0000000000
88+
-0 ** 1 = 0.0000000000
89+
-0 ** 1128321638 = 0.0000000000
90+
91+
Number "0" (scale 10)
92+
0 ** 0 = 1.0000000000
93+
0 ** -0 = 1.0000000000
94+
0 ** 1 = 0.0000000000
95+
0 ** 1128321638 = 0.0000000000

0 commit comments

Comments
 (0)