Merge branch 'PHP-8.4'

* PHP-8.4:
  Fix GH-16890: array_sum() with GMP can loose precision (LLP64)
This commit is contained in:
Christoph M. Becker 2024-11-25 12:56:25 +01:00
commit e87a433c20
No known key found for this signature in database
GPG key ID: D66C9593118BCCB6
2 changed files with 16 additions and 1 deletions

View file

@ -32,6 +32,10 @@
#include "ext/random/php_random.h" #include "ext/random/php_random.h"
#include "ext/random/php_random_csprng.h" #include "ext/random/php_random_csprng.h"
#ifndef mpz_fits_si_p
# define mpz_fits_si_p mpz_fits_slong_p
#endif
#define GMP_ROUND_ZERO 0 #define GMP_ROUND_ZERO 0
#define GMP_ROUND_PLUSINF 1 #define GMP_ROUND_PLUSINF 1
#define GMP_ROUND_MINUSINF 2 #define GMP_ROUND_MINUSINF 2
@ -293,7 +297,7 @@ static zend_result gmp_cast_object(zend_object *readobj, zval *writeobj, int typ
return SUCCESS; return SUCCESS;
case _IS_NUMBER: case _IS_NUMBER:
gmpnum = GET_GMP_OBJECT_FROM_OBJ(readobj)->num; gmpnum = GET_GMP_OBJECT_FROM_OBJ(readobj)->num;
if (mpz_fits_slong_p(gmpnum)) { if (mpz_fits_si_p(gmpnum)) {
ZVAL_LONG(writeobj, mpz_get_si(gmpnum)); ZVAL_LONG(writeobj, mpz_get_si(gmpnum));
} else { } else {
ZVAL_DOUBLE(writeobj, mpz_get_d(gmpnum)); ZVAL_DOUBLE(writeobj, mpz_get_d(gmpnum));

View file

@ -0,0 +1,11 @@
--TEST--
GH-16890 (array_sum() with GMP can loose precision (LLP64))
--EXTENSIONS--
gmp
--FILE--
<?php
$large_int_string = (string) (PHP_INT_MAX - 1);
var_dump(array_sum([new GMP($large_int_string), 1]) === PHP_INT_MAX);
?>
--EXPECT--
bool(true)