@@ -183,23 +183,28 @@ PHP_FUNCTION(bcadd)
183
183
184
184
if (php_str2num (& first , ZSTR_VAL (left )) == FAILURE ) {
185
185
zend_argument_value_error (1 , "is not well-formed" );
186
- goto cleanup ;
186
+ goto fail ;
187
187
}
188
188
189
189
if (php_str2num (& second , ZSTR_VAL (right )) == FAILURE ) {
190
190
zend_argument_value_error (2 , "is not well-formed" );
191
- goto cleanup ;
191
+ goto fail ;
192
192
}
193
193
194
194
bc_add (first , second , & result , scale );
195
195
196
+ bc_free_num (& first );
197
+ bc_free_num (& second );
196
198
RETVAL_STR (bc_num2str_ex (result , scale ));
197
199
198
- cleanup : {
200
+ bc_free_num (& result );
201
+ return ;
202
+
203
+ fail : {
199
204
bc_free_num (& first );
200
205
bc_free_num (& second );
201
206
bc_free_num (& result );
202
- };
207
+ }
203
208
}
204
209
/* }}} */
205
210
@@ -234,23 +239,28 @@ PHP_FUNCTION(bcsub)
234
239
235
240
if (php_str2num (& first , ZSTR_VAL (left )) == FAILURE ) {
236
241
zend_argument_value_error (1 , "is not well-formed" );
237
- goto cleanup ;
242
+ goto fail ;
238
243
}
239
244
240
245
if (php_str2num (& second , ZSTR_VAL (right )) == FAILURE ) {
241
246
zend_argument_value_error (2 , "is not well-formed" );
242
- goto cleanup ;
247
+ goto fail ;
243
248
}
244
249
245
250
bc_sub (first , second , & result , scale );
246
251
252
+ bc_free_num (& first );
253
+ bc_free_num (& second );
247
254
RETVAL_STR (bc_num2str_ex (result , scale ));
248
255
249
- cleanup : {
256
+ bc_free_num (& result );
257
+ return ;
258
+
259
+ fail : {
250
260
bc_free_num (& first );
251
261
bc_free_num (& second );
252
262
bc_free_num (& result );
253
- };
263
+ }
254
264
}
255
265
/* }}} */
256
266
@@ -285,19 +295,24 @@ PHP_FUNCTION(bcmul)
285
295
286
296
if (php_str2num (& first , ZSTR_VAL (left )) == FAILURE ) {
287
297
zend_argument_value_error (1 , "is not well-formed" );
288
- goto cleanup ;
298
+ goto fail ;
289
299
}
290
300
291
301
if (php_str2num (& second , ZSTR_VAL (right )) == FAILURE ) {
292
302
zend_argument_value_error (2 , "is not well-formed" );
293
- goto cleanup ;
303
+ goto fail ;
294
304
}
295
305
296
306
bc_multiply (first , second , & result , scale );
297
307
308
+ bc_free_num (& first );
309
+ bc_free_num (& second );
298
310
RETVAL_STR (bc_num2str_ex (result , scale ));
299
311
300
- cleanup : {
312
+ bc_free_num (& result );
313
+ return ;
314
+
315
+ fail : {
301
316
bc_free_num (& first );
302
317
bc_free_num (& second );
303
318
bc_free_num (& result );
@@ -336,22 +351,27 @@ PHP_FUNCTION(bcdiv)
336
351
337
352
if (php_str2num (& first , ZSTR_VAL (left )) == FAILURE ) {
338
353
zend_argument_value_error (1 , "is not well-formed" );
339
- goto cleanup ;
354
+ goto fail ;
340
355
}
341
356
342
357
if (php_str2num (& second , ZSTR_VAL (right )) == FAILURE ) {
343
358
zend_argument_value_error (2 , "is not well-formed" );
344
- goto cleanup ;
359
+ goto fail ;
345
360
}
346
361
347
362
if (!bc_divide (first , second , & result , scale )) {
348
363
zend_throw_exception_ex (zend_ce_division_by_zero_error , 0 , "Division by zero" );
349
- goto cleanup ;
364
+ goto fail ;
350
365
}
351
366
367
+ bc_free_num (& first );
368
+ bc_free_num (& second );
352
369
RETVAL_STR (bc_num2str_ex (result , scale ));
353
370
354
- cleanup : {
371
+ bc_free_num (& result );
372
+ return ;
373
+
374
+ fail : {
355
375
bc_free_num (& first );
356
376
bc_free_num (& second );
357
377
bc_free_num (& result );
@@ -390,22 +410,27 @@ PHP_FUNCTION(bcmod)
390
410
391
411
if (php_str2num (& first , ZSTR_VAL (left )) == FAILURE ) {
392
412
zend_argument_value_error (1 , "is not well-formed" );
393
- goto cleanup ;
413
+ goto fail ;
394
414
}
395
415
396
416
if (php_str2num (& second , ZSTR_VAL (right )) == FAILURE ) {
397
417
zend_argument_value_error (2 , "is not well-formed" );
398
- goto cleanup ;
418
+ goto fail ;
399
419
}
400
420
401
421
if (!bc_modulo (first , second , & result , scale )) {
402
422
zend_throw_exception_ex (zend_ce_division_by_zero_error , 0 , "Modulo by zero" );
403
- goto cleanup ;
423
+ goto fail ;
404
424
}
405
425
426
+ bc_free_num (& first );
427
+ bc_free_num (& second );
406
428
RETVAL_STR (bc_num2str_ex (result , scale ));
407
429
408
- cleanup : {
430
+ bc_free_num (& result );
431
+ return ;
432
+
433
+ fail : {
409
434
bc_free_num (& first );
410
435
bc_free_num (& second );
411
436
bc_free_num (& result );
@@ -446,43 +471,47 @@ PHP_FUNCTION(bcpowmod)
446
471
447
472
if (php_str2num (& bc_base , ZSTR_VAL (base_str )) == FAILURE ) {
448
473
zend_argument_value_error (1 , "is not well-formed" );
449
- goto cleanup ;
474
+ goto fail ;
450
475
}
451
476
452
477
if (php_str2num (& bc_expo , ZSTR_VAL (exponent_str )) == FAILURE ) {
453
478
zend_argument_value_error (2 , "is not well-formed" );
454
- goto cleanup ;
479
+ goto fail ;
455
480
}
456
481
457
482
if (php_str2num (& bc_modulus , ZSTR_VAL (modulus_str )) == FAILURE ) {
458
483
zend_argument_value_error (3 , "is not well-formed" );
459
- goto cleanup ;
484
+ goto fail ;
460
485
}
461
486
462
487
raise_mod_status status = bc_raisemod (bc_base , bc_expo , bc_modulus , & result , scale );
463
488
switch (status ) {
464
489
case BASE_HAS_FRACTIONAL :
465
490
zend_argument_value_error (1 , "cannot have a fractional part" );
466
- goto cleanup ;
491
+ goto fail ;
467
492
case EXPO_HAS_FRACTIONAL :
468
493
zend_argument_value_error (2 , "cannot have a fractional part" );
469
- goto cleanup ;
494
+ goto fail ;
470
495
case EXPO_IS_NEGATIVE :
471
496
zend_argument_value_error (2 , "must be greater than or equal to 0" );
472
- goto cleanup ;
497
+ goto fail ;
473
498
case MOD_HAS_FRACTIONAL :
474
499
zend_argument_value_error (3 , "cannot have a fractional part" );
475
- goto cleanup ;
500
+ goto fail ;
476
501
case MOD_IS_ZERO :
477
502
zend_throw_exception_ex (zend_ce_division_by_zero_error , 0 , "Modulo by zero" );
478
- goto cleanup ;
503
+ goto fail ;
479
504
case OK :
505
+ bc_free_num (& bc_base );
506
+ bc_free_num (& bc_expo );
507
+ bc_free_num (& bc_modulus );
480
508
RETVAL_STR (bc_num2str_ex (result , scale ));
481
- break ;
509
+ bc_free_num (& result );
510
+ return ;
482
511
EMPTY_SWITCH_DEFAULT_CASE ();
483
512
}
484
513
485
- cleanup : {
514
+ fail : {
486
515
bc_free_num (& bc_base );
487
516
bc_free_num (& bc_expo );
488
517
bc_free_num (& bc_modulus );
@@ -522,30 +551,35 @@ PHP_FUNCTION(bcpow)
522
551
523
552
if (php_str2num (& first , ZSTR_VAL (base_str )) == FAILURE ) {
524
553
zend_argument_value_error (1 , "is not well-formed" );
525
- goto cleanup ;
554
+ goto fail ;
526
555
}
527
556
528
557
if (php_str2num (& bc_exponent , ZSTR_VAL (exponent_str )) == FAILURE ) {
529
558
zend_argument_value_error (2 , "is not well-formed" );
530
- goto cleanup ;
559
+ goto fail ;
531
560
}
532
561
533
562
/* Check the exponent for scale digits and convert to a long. */
534
563
if (bc_exponent -> n_scale != 0 ) {
535
564
zend_argument_value_error (2 , "cannot have a fractional part" );
536
- goto cleanup ;
565
+ goto fail ;
537
566
}
538
567
long exponent = bc_num2long (bc_exponent );
539
568
if (exponent == 0 && (bc_exponent -> n_len > 1 || bc_exponent -> n_value [0 ] != 0 )) {
540
569
zend_argument_value_error (2 , "is too large" );
541
- goto cleanup ;
570
+ goto fail ;
542
571
}
543
572
544
573
bc_raise (first , exponent , & result , scale );
545
574
575
+ bc_free_num (& first );
576
+ bc_free_num (& bc_exponent );
546
577
RETVAL_STR (bc_num2str_ex (result , scale ));
547
578
548
- cleanup : {
579
+ bc_free_num (& result );
580
+ return ;
581
+
582
+ fail : {
549
583
bc_free_num (& first );
550
584
bc_free_num (& bc_exponent );
551
585
bc_free_num (& result );
0 commit comments