diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2017-09-07 00:31:38 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2017-09-07 00:32:39 +0200 |
commit | 0f88a49fd511e6c68d004cc4aecd7aae76dbd63f (patch) | |
tree | ea0bbdd244254e32219828f22e44035f96e5c792 /ext/bcmath/libbcmath/src | |
parent | d724d8c1076dc6e7ca5665fe68753e71440655c1 (diff) | |
parent | b2919853f867ca7948e1c80c48eb868eae4ba882 (diff) | |
download | php-git-0f88a49fd511e6c68d004cc4aecd7aae76dbd63f.tar.gz |
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0:
Fixed bug #54598 (bcpowmod() may return 1 if modulus is 1)
Diffstat (limited to 'ext/bcmath/libbcmath/src')
-rw-r--r-- | ext/bcmath/libbcmath/src/raisemod.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/ext/bcmath/libbcmath/src/raisemod.c b/ext/bcmath/libbcmath/src/raisemod.c index 72a838a364..84a7321ea7 100644 --- a/ext/bcmath/libbcmath/src/raisemod.c +++ b/ext/bcmath/libbcmath/src/raisemod.c @@ -75,17 +75,24 @@ bc_raisemod (bc_num base, bc_num expo, bc_num mod, bc_num *result, int scale) /* Do the calculation. */ 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); - if ( !bc_is_zero(parity) ) + temp = bc_new_num (1, scale); + } + else + { + while ( !bc_is_zero(exponent) ) { - bc_multiply (temp, power, &temp, rscale); - (void) bc_modulo (temp, mod, &temp, scale); + (void) bc_divmod (exponent, BCG(_two_), &exponent, &parity, 0); + if ( !bc_is_zero(parity) ) + { + bc_multiply (temp, power, &temp, rscale); + (void) bc_modulo (temp, mod, &temp, scale); + } + + bc_multiply (power, power, &power, rscale); + (void) bc_modulo (power, mod, &power, scale); } - - bc_multiply (power, power, &power, rscale); - (void) bc_modulo (power, mod, &power, scale); } /* Assign the value. */ |