@@ -152,7 +152,11 @@ PHP_FUNCTION(bcadd)
152
152
ZEND_PARSE_PARAMETERS_END ();
153
153
154
154
if (ZEND_NUM_ARGS () == 3 ) {
155
- scale = (int ) (scale_param < 0 ? 0 : scale_param );
155
+ if (scale_param < 0 || scale_param > INT_MAX ) {
156
+ zend_argument_value_error (3 , "must be greater than or equal to 0 and less than INT_MAX (%d)" , INT_MAX );
157
+ RETURN_THROWS ();
158
+ }
159
+ scale = (int ) scale_param ;
156
160
}
157
161
158
162
bc_init_num (& first );
@@ -187,7 +191,11 @@ PHP_FUNCTION(bcsub)
187
191
ZEND_PARSE_PARAMETERS_END ();
188
192
189
193
if (ZEND_NUM_ARGS () == 3 ) {
190
- scale = (int ) ((int )scale_param < 0 ? 0 : scale_param );
194
+ if (scale_param < 0 || scale_param > INT_MAX ) {
195
+ zend_argument_value_error (3 , "must be greater than or equal to 0 and less than INT_MAX (%d)" , INT_MAX );
196
+ RETURN_THROWS ();
197
+ }
198
+ scale = (int ) scale_param ;
191
199
}
192
200
193
201
bc_init_num (& first );
@@ -222,7 +230,11 @@ PHP_FUNCTION(bcmul)
222
230
ZEND_PARSE_PARAMETERS_END ();
223
231
224
232
if (ZEND_NUM_ARGS () == 3 ) {
225
- scale = (int ) ((int )scale_param < 0 ? 0 : scale_param );
233
+ if (scale_param < 0 || scale_param > INT_MAX ) {
234
+ zend_argument_value_error (3 , "must be greater than or equal to 0 and less than INT_MAX (%d)" , INT_MAX );
235
+ RETURN_THROWS ();
236
+ }
237
+ scale = (int ) scale_param ;
226
238
}
227
239
228
240
bc_init_num (& first );
@@ -257,7 +269,11 @@ PHP_FUNCTION(bcdiv)
257
269
ZEND_PARSE_PARAMETERS_END ();
258
270
259
271
if (ZEND_NUM_ARGS () == 3 ) {
260
- scale = (int ) ((int )scale_param < 0 ? 0 : scale_param );
272
+ if (scale_param < 0 || scale_param > INT_MAX ) {
273
+ zend_argument_value_error (3 , "must be greater than or equal to 0 and less than INT_MAX (%d)" , INT_MAX );
274
+ RETURN_THROWS ();
275
+ }
276
+ scale = (int ) scale_param ;
261
277
}
262
278
263
279
bc_init_num (& first );
@@ -299,7 +315,11 @@ PHP_FUNCTION(bcmod)
299
315
ZEND_PARSE_PARAMETERS_END ();
300
316
301
317
if (ZEND_NUM_ARGS () == 3 ) {
302
- scale = (int ) ((int )scale_param < 0 ? 0 : scale_param );
318
+ if (scale_param < 0 || scale_param > INT_MAX ) {
319
+ zend_argument_value_error (3 , "must be greater than or equal to 0 and less than INT_MAX (%d)" , INT_MAX );
320
+ RETURN_THROWS ();
321
+ }
322
+ scale = (int ) scale_param ;
303
323
}
304
324
305
325
bc_init_num (& first );
@@ -329,16 +349,16 @@ PHP_FUNCTION(bcmod)
329
349
PHP_FUNCTION (bcpowmod )
330
350
{
331
351
zend_string * left , * right , * modulus ;
352
+ zend_long scale_param = 0 ;
332
353
bc_num first , second , mod , result ;
333
- zend_long scale = BCG (bc_precision );
334
- int scale_int ;
354
+ int scale = (int )BCG (bc_precision );
335
355
336
356
ZEND_PARSE_PARAMETERS_START (3 , 4 )
337
357
Z_PARAM_STR (left )
338
358
Z_PARAM_STR (right )
339
359
Z_PARAM_STR (modulus )
340
360
Z_PARAM_OPTIONAL
341
- Z_PARAM_LONG (scale )
361
+ Z_PARAM_LONG (scale_param )
342
362
ZEND_PARSE_PARAMETERS_END ();
343
363
344
364
bc_init_num (& first );
@@ -349,10 +369,16 @@ PHP_FUNCTION(bcpowmod)
349
369
php_str2num (& second , ZSTR_VAL (right ));
350
370
php_str2num (& mod , ZSTR_VAL (modulus ));
351
371
352
- scale_int = (int ) ((int )scale < 0 ? 0 : scale );
372
+ if (ZEND_NUM_ARGS () == 4 ) {
373
+ if (scale_param < 0 || scale_param > INT_MAX ) {
374
+ zend_argument_value_error (4 , "must be greater than or equal to 0 and less than INT_MAX (%d)" , INT_MAX );
375
+ RETURN_THROWS ();
376
+ }
377
+ scale = (int ) scale_param ;
378
+ }
353
379
354
- if (bc_raisemod (first , second , mod , & result , scale_int ) != -1 ) {
355
- RETVAL_STR (bc_num2str_ex (result , scale_int ));
380
+ if (bc_raisemod (first , second , mod , & result , scale ) != -1 ) {
381
+ RETVAL_STR (bc_num2str_ex (result , scale ));
356
382
} else {
357
383
RETVAL_FALSE ;
358
384
}
@@ -382,7 +408,11 @@ PHP_FUNCTION(bcpow)
382
408
ZEND_PARSE_PARAMETERS_END ();
383
409
384
410
if (ZEND_NUM_ARGS () == 3 ) {
385
- scale = (int ) ((int )scale_param < 0 ? 0 : scale_param );
411
+ if (scale_param < 0 || scale_param > INT_MAX ) {
412
+ zend_argument_value_error (3 , "must be greater than or equal to 0 and less than INT_MAX (%d)" , INT_MAX );
413
+ RETURN_THROWS ();
414
+ }
415
+ scale = (int ) scale_param ;
386
416
}
387
417
388
418
bc_init_num (& first );
@@ -416,7 +446,11 @@ PHP_FUNCTION(bcsqrt)
416
446
ZEND_PARSE_PARAMETERS_END ();
417
447
418
448
if (ZEND_NUM_ARGS () == 2 ) {
419
- scale = (int ) ((int )scale_param < 0 ? 0 : scale_param );
449
+ if (scale_param < 0 || scale_param > INT_MAX ) {
450
+ zend_argument_value_error (2 , "must be greater than or equal to 0 and less than INT_MAX (%d)" , INT_MAX );
451
+ RETURN_THROWS ();
452
+ }
453
+ scale = (int ) scale_param ;
420
454
}
421
455
422
456
bc_init_num (& result );
@@ -450,7 +484,11 @@ PHP_FUNCTION(bccomp)
450
484
ZEND_PARSE_PARAMETERS_END ();
451
485
452
486
if (ZEND_NUM_ARGS () == 3 ) {
453
- scale = (int ) ((int )scale_param < 0 ? 0 : scale_param );
487
+ if (scale_param < 0 || scale_param > INT_MAX ) {
488
+ zend_argument_value_error (3 , "must be greater than or equal to 0 and less than INT_MAX (%d)" , INT_MAX );
489
+ RETURN_THROWS ();
490
+ }
491
+ scale = (int ) scale_param ;
454
492
}
455
493
456
494
bc_init_num (& first );
@@ -484,7 +522,11 @@ PHP_FUNCTION(bcscale)
484
522
old_scale = BCG (bc_precision );
485
523
486
524
if (ZEND_NUM_ARGS () == 1 ) {
487
- BCG (bc_precision ) = ((int )new_scale < 0 ) ? 0 : new_scale ;
525
+ if (new_scale < 0 || new_scale > INT_MAX ) {
526
+ zend_argument_value_error (1 , "must be greater than or equal to 0 and less than INT_MAX (%d)" , INT_MAX );
527
+ RETURN_THROWS ();
528
+ }
529
+ BCG (bc_precision ) = (int ) new_scale ;
488
530
}
489
531
490
532
RETURN_LONG (old_scale );
0 commit comments