Merge branch 'PHP-8.3' into PHP-8.4

This commit is contained in:
David Carlier 2024-10-13 14:26:59 +01:00
commit 61d34b3ebc
No known key found for this signature in database
GPG Key ID: 8486F847B4B94EF1
3 changed files with 51 additions and 2 deletions

4
NEWS
View File

@ -26,6 +26,10 @@ PHP NEWS
. Fixed bug GH-16334 (imageaffine overflow on matrix elements).
(David Carlier)
- GMP:
. Fixed floating point exception bug with gmp_pow when using
large exposant values. (David Carlier).
- MBstring:
. Fixed bug GH-16361 (mb_substr overflow on start/length arguments).
(David Carlier)

View File

@ -1288,12 +1288,37 @@ ZEND_FUNCTION(gmp_pow)
if (Z_TYPE_P(base_arg) == IS_LONG && Z_LVAL_P(base_arg) >= 0) {
INIT_GMP_RETVAL(gmpnum_result);
mpz_ui_pow_ui(gmpnum_result, Z_LVAL_P(base_arg), exp);
if (exp >= INT_MAX) {
mpz_t base_num, exp_num, mod;
mpz_init(base_num);
mpz_init(exp_num);
mpz_init(mod);
mpz_set_si(base_num, Z_LVAL_P(base_arg));
mpz_set_si(exp_num, exp);
mpz_set_ui(mod, UINT_MAX);
mpz_powm(gmpnum_result, base_num, exp_num, mod);
mpz_clear(mod);
mpz_clear(exp_num);
mpz_clear(base_num);
} else {
mpz_ui_pow_ui(gmpnum_result, Z_LVAL_P(base_arg), exp);
}
} else {
mpz_ptr gmpnum_base;
FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base, 1);
INIT_GMP_RETVAL(gmpnum_result);
mpz_pow_ui(gmpnum_result, gmpnum_base, exp);
if (exp >= INT_MAX) {
mpz_t exp_num, mod;
mpz_init(exp_num);
mpz_init(mod);
mpz_set_si(exp_num, exp);
mpz_set_ui(mod, UINT_MAX);
mpz_powm(gmpnum_result, gmpnum_base, exp_num, mod);
mpz_clear(mod);
mpz_clear(exp_num);
} else {
mpz_pow_ui(gmpnum_result, gmpnum_base, exp);
}
FREE_GMP_TEMP(temp_base);
}
}

View File

@ -0,0 +1,20 @@
--TEST--
gmp_pow() floating point exception
--EXTENSIONS--
gmp
--FILE--
<?php
$g = gmp_init(256);
var_dump(gmp_pow($g, PHP_INT_MAX));
var_dump(gmp_pow(256, PHP_INT_MAX));
?>
--EXPECTF--
object(GMP)#2 (1) {
["num"]=>
string(%d) "%s"
}
object(GMP)#2 (1) {
["num"]=>
string(%d) "%s"
}