From 9e23b4f2f057f3ef6e8acdf8095648b6b507cb50 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 5 Apr 2025 08:44:01 +0100 Subject: [PATCH] ext/gmp: allow real number to create gmp int. --- ext/gmp/gmp.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index f38ffef17aa32..ad3c607ae533e 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -651,14 +651,20 @@ static zend_result convert_zstr_to_gmp(mpz_t gmp_number, const zend_string *val, } } - int gmp_ret = mpz_set_str(gmp_number, (skip_lead ? &num_str[2] : num_str), (int) base); + const char *nval = (skip_lead ? &num_str[2] : num_str); + int gmp_ret = mpz_set_str(gmp_number, nval, (int) base); if (-1 == gmp_ret) { - if (arg_pos == 0) { - zend_value_error("Number is not an integer string"); - } else { - zend_argument_value_error(arg_pos, "is not an integer string"); + const char *err; + double dval = zend_strtod(nval, &err); + if (err == nval || *err != '\0') { + if (arg_pos == 0) { + zend_value_error("Number is not an integer string"); + } else { + zend_argument_value_error(arg_pos, "is not an integer string"); + } + return FAILURE; } - return FAILURE; + mpz_set_d(gmp_number, dval); } return SUCCESS;