From 9e23b4f2f057f3ef6e8acdf8095648b6b507cb50 Mon Sep 17 00:00:00 2001
From: David Carlier <devnexen@gmail.com>
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;