]> granicus.if.org Git - php/commitdiff
Fix GMP comparison object handler
authorGeorge Peter Banyard <girgias@php.net>
Tue, 29 Dec 2020 16:50:37 +0000 (17:50 +0100)
committerGeorge Peter Banyard <girgias@php.net>
Mon, 4 Jan 2021 13:47:50 +0000 (14:47 +0100)
gmp_cmp() doesn't return false anymore in PHP 8 but will throw
an Error if compared to a non numeric string or another type of object.

Closes GH-6553

ext/gmp/gmp.c
ext/gmp/tests/comparison_invalid.phpt [new file with mode: 0644]

index b7ba99fbdca6211967b6a6d1d7e51271dda0f8aa..0f4b317fd0fa23e27e1b8cf588d6bc250fa04266 100644 (file)
@@ -429,9 +429,14 @@ static int gmp_compare(zval *op1, zval *op2) /* {{{ */
        zval result;
 
        gmp_cmp(&result, op1, op2);
-       if (Z_TYPE(result) == IS_FALSE) {
+
+       /* An error/exception occurs if one of the operands is not a numeric string
+        * or an object which is different from GMP */
+       if (EG(exception)) {
                return 1;
        }
+       /* result can only be a zend_long if gmp_cmp hasn't thrown an Error */
+       ZEND_ASSERT(Z_TYPE(result) == IS_LONG);
        return Z_LVAL(result);
 }
 /* }}} */
diff --git a/ext/gmp/tests/comparison_invalid.phpt b/ext/gmp/tests/comparison_invalid.phpt
new file mode 100644 (file)
index 0000000..8c0dfb9
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+Invalid comparison with a GMP object
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--FILE--
+<?php
+
+try {
+    var_dump("hapfegfbu" > gmp_init(0));
+} catch (\Error $e) {
+    echo $e::class, ': ', $e->getMessage(), \PHP_EOL;
+}
+
+try {
+    var_dump((new DateTime()) > gmp_init(0));
+} catch (\Error $e) {
+    echo $e::class, ': ', $e->getMessage(), \PHP_EOL;
+}
+
+?>
+--EXPECT--
+TypeError: main(): Argument #2 is not an integer string
+TypeError: main(): Argument #2 must be of type GMP|string|int, DateTime given