@@ -40,6 +40,15 @@ static IMPLEMENT_THREAD_LOCAL(bcmath_data, s_globals);
40
40
41
41
// /////////////////////////////////////////////////////////////////////////////
42
42
43
+ static int64_t adjust_scale (int64_t scale) {
44
+ if (scale < 0 ) {
45
+ scale = BCG (bc_precision);
46
+ if (scale < 0 ) scale = 0 ;
47
+ }
48
+ if ((uint64_t )scale > StringData::MaxSize) return StringData::MaxSize;
49
+ return scale;
50
+ }
51
+
43
52
static void php_str2num (bc_num *num, const char *str) {
44
53
const char *p;
45
54
if (!(p = strchr (str, ' .' ))) {
@@ -56,7 +65,7 @@ static bool HHVM_FUNCTION(bcscale, int64_t scale) {
56
65
57
66
static String HHVM_FUNCTION (bcadd, const String& left, const String& right,
58
67
int64_t scale /* = -1 */ ) {
59
- if ( scale < 0 ) scale = BCG (bc_precision );
68
+ scale = adjust_scale (scale );
60
69
bc_num first, second, result;
61
70
bc_init_num (&first);
62
71
bc_init_num (&second);
@@ -76,7 +85,7 @@ static String HHVM_FUNCTION(bcadd, const String& left, const String& right,
76
85
77
86
static String HHVM_FUNCTION (bcsub, const String& left, const String& right,
78
87
int64_t scale /* = -1 */ ) {
79
- if ( scale < 0 ) scale = BCG (bc_precision );
88
+ scale = adjust_scale (scale );
80
89
bc_num first, second, result;
81
90
bc_init_num (&first);
82
91
bc_init_num (&second);
@@ -96,7 +105,7 @@ static String HHVM_FUNCTION(bcsub, const String& left, const String& right,
96
105
97
106
static int64_t HHVM_FUNCTION (bccomp, const String& left, const String& right,
98
107
int64_t scale /* = -1 */ ) {
99
- if ( scale < 0 ) scale = BCG (bc_precision );
108
+ scale = adjust_scale (scale );
100
109
bc_num first, second;
101
110
bc_init_num (&first);
102
111
bc_init_num (&second);
@@ -110,7 +119,7 @@ static int64_t HHVM_FUNCTION(bccomp, const String& left, const String& right,
110
119
111
120
static String HHVM_FUNCTION (bcmul, const String& left, const String& right,
112
121
int64_t scale /* = -1 */ ) {
113
- if ( scale < 0 ) scale = BCG (bc_precision );
122
+ scale = adjust_scale (scale );
114
123
bc_num first, second, result;
115
124
bc_init_num (&first);
116
125
bc_init_num (&second);
@@ -130,7 +139,7 @@ static String HHVM_FUNCTION(bcmul, const String& left, const String& right,
130
139
131
140
static Variant HHVM_FUNCTION (bcdiv, const String& left, const String& right,
132
141
int64_t scale /* = -1 */ ) {
133
- if ( scale < 0 ) scale = BCG (bc_precision );
142
+ scale = adjust_scale (scale );
134
143
bc_num first, second, result;
135
144
bc_init_num (&first);
136
145
bc_init_num (&second);
@@ -172,7 +181,7 @@ static Variant HHVM_FUNCTION(bcmod, const String& left, const String& right) {
172
181
173
182
static String HHVM_FUNCTION (bcpow, const String& left, const String& right,
174
183
int64_t scale /* = -1 */ ) {
175
- if ( scale < 0 ) scale = BCG (bc_precision );
184
+ scale = adjust_scale (scale );
176
185
bc_num first, second, result;
177
186
bc_init_num (&first);
178
187
bc_init_num (&second);
@@ -194,7 +203,7 @@ static String HHVM_FUNCTION(bcpow, const String& left, const String& right,
194
203
195
204
static Variant HHVM_FUNCTION (bcpowmod, const String& left, const String& right,
196
205
const String& modulus, int64_t scale /* = -1 */ ) {
197
- if ( scale < 0 ) scale = BCG (bc_precision );
206
+ scale = adjust_scale (scale );
198
207
bc_num first, second, mod, result;
199
208
bc_init_num (&first);
200
209
bc_init_num (&second);
@@ -221,7 +230,7 @@ static Variant HHVM_FUNCTION(bcpowmod, const String& left, const String& right,
221
230
222
231
static Variant HHVM_FUNCTION (bcsqrt, const String& operand,
223
232
int64_t scale /* = -1 */ ) {
224
- if ( scale < 0 ) scale = BCG (bc_precision );
233
+ scale = adjust_scale (scale );
225
234
bc_num result;
226
235
bc_init_num (&result);
227
236
SCOPE_EXIT {
0 commit comments