summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2017-09-07 00:30:05 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2017-09-07 00:30:05 +0200
commitb2919853f867ca7948e1c80c48eb868eae4ba882 (patch)
tree0b20f01dd25f8bd4204e07d257d44e84ec809802
parentdea41f3c3a003a22893b27eead429f963d3230c3 (diff)
downloadphp-git-b2919853f867ca7948e1c80c48eb868eae4ba882.tar.gz
Fixed bug #54598 (bcpowmod() may return 1 if modulus is 1)
`x mod 1` is always zero; we have to take the scale into account, though.
-rw-r--r--NEWS1
-rw-r--r--ext/bcmath/libbcmath/src/raisemod.c23
-rw-r--r--ext/bcmath/tests/bug54598.phpt16
3 files changed, 32 insertions, 8 deletions
diff --git a/NEWS b/NEWS
index 377f4d1540..7fb0cb1065 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ PHP NEWS
- BCMath:
. Fixed bug #44995 (bcpowmod() fails if scale != 0). (cmb)
+ . Fixed bug #54598 (bcpowmod() may return 1 if modulus is 1). (okano1220, cmb)
- CLI server:
. Fixed bug #70470 (Built-in server truncates headers spanning over TCP
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. */
diff --git a/ext/bcmath/tests/bug54598.phpt b/ext/bcmath/tests/bug54598.phpt
new file mode 100644
index 0000000000..6ccd61a2d0
--- /dev/null
+++ b/ext/bcmath/tests/bug54598.phpt
@@ -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===