Merge branch 'PHP-7.0' into PHP-7.1

* PHP-7.0:
  Fixed bug #54598 (bcpowmod() may return 1 if modulus is 1)
This commit is contained in:
Christoph M. Becker 2017-09-07 00:31:38 +02:00
commit 0f88a49fd5
3 changed files with 32 additions and 8 deletions

1
NEWS
View file

@ -7,6 +7,7 @@ PHP NEWS
- BCMath: - BCMath:
. Fixed bug #44995 (bcpowmod() fails if scale != 0). (cmb) . Fixed bug #44995 (bcpowmod() fails if scale != 0). (cmb)
. Fixed bug #54598 (bcpowmod() may return 1 if modulus is 1). (okano1220, cmb)
- CLI server: - CLI server:
. Fixed bug #70470 (Built-in server truncates headers spanning over TCP . Fixed bug #70470 (Built-in server truncates headers spanning over TCP

View file

@ -75,17 +75,24 @@ bc_raisemod (bc_num base, bc_num expo, bc_num mod, bc_num *result, int scale)
/* Do the calculation. */ /* Do the calculation. */
rscale = MAX(scale, base->n_scale); rscale = MAX(scale, base->n_scale);
while ( !bc_is_zero(exponent) ) if ( !bc_compare(mod, BCG(_one_)) )
{ {
(void) bc_divmod (exponent, BCG(_two_), &exponent, &parity, 0); temp = bc_new_num (1, scale);
if ( !bc_is_zero(parity) ) }
else
{
while ( !bc_is_zero(exponent) )
{ {
bc_multiply (temp, power, &temp, rscale); (void) bc_divmod (exponent, BCG(_two_), &exponent, &parity, 0);
(void) bc_modulo (temp, mod, &temp, scale); if ( !bc_is_zero(parity) )
} {
bc_multiply (temp, power, &temp, rscale);
(void) bc_modulo (temp, mod, &temp, scale);
}
bc_multiply (power, power, &power, rscale); bc_multiply (power, power, &power, rscale);
(void) bc_modulo (power, mod, &power, scale); (void) bc_modulo (power, mod, &power, scale);
}
} }
/* Assign the value. */ /* Assign the value. */

View file

@ -0,0 +1,16 @@
--TEST--
Bug #54598 (bcpowmod() may return 1 if modulus is 1)
--SKIPIF--
<?php
if (!extension_loaded('bcmath')) die('skip bcmath extension is not available');
?>
--FILE--
<?php
var_dump(bcpowmod(5, 0, 1));
var_dump(bcpowmod(5, 0, 1, 3));
?>
===DONE===
--EXPECT--
string(1) "0"
string(5) "0.000"
===DONE===