Skip to content

Commit c3f81b4

Browse files
committed
ext/gmp: Fix segfault when null is encountered on an overloaded operator
1 parent a4bc271 commit c3f81b4

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

ext/gmp/gmp.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,13 @@ static zend_result convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, ui
619619
case IS_STRING: {
620620
return convert_zstr_to_gmp(gmpnumber, Z_STR_P(val), base, arg_pos);
621621
}
622+
case IS_NULL:
623+
/* Just reject null for operator overloading */
624+
if (arg_pos == 0) {
625+
zend_type_error("Number must be of type GMP|string|int, %s given", zend_zval_type_name(val));
626+
return FAILURE;
627+
}
628+
ZEND_FALLTHROUGH;
622629
default: {
623630
zend_long lval;
624631
if (!zend_parse_arg_long_slow(val, &lval, arg_pos)) {

ext/gmp/tests/overloading_with_null.phpt

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
GMP operator overloading does not support null
33
--EXTENSIONS--
44
gmp
5-
--XFAIL--
6-
Test showcasing segfaulting behaviour
75
--FILE--
86
<?php
97

@@ -73,4 +71,23 @@ try {
7371

7472
?>
7573
--EXPECT--
76-
SEGFAULT
74+
TypeError: Number must be of type GMP|string|int, null given
75+
TypeError: Number must be of type GMP|string|int, null given
76+
TypeError: Number must be of type GMP|string|int, null given
77+
TypeError: Number must be of type GMP|string|int, null given
78+
TypeError: Number must be of type GMP|string|int, null given
79+
object(GMP)#3 (1) {
80+
["num"]=>
81+
string(1) "1"
82+
}
83+
TypeError: Number must be of type GMP|string|int, null given
84+
TypeError: Number must be of type GMP|string|int, null given
85+
TypeError: Number must be of type GMP|string|int, null given
86+
object(GMP)#2 (1) {
87+
["num"]=>
88+
string(2) "42"
89+
}
90+
object(GMP)#2 (1) {
91+
["num"]=>
92+
string(2) "42"
93+
}

0 commit comments

Comments
 (0)