diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 4674868370b..48c9de2996d 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -162,12 +162,17 @@ zval *xmlreader_write_property(zend_object *object, zend_string *name, zval *val /* {{{ */ static zend_function *xmlreader_get_method(zend_object **obj, zend_string *name, const zval *key) { - if (zend_string_equals_literal_ci(name, "open")) { - return (zend_function*)&xmlreader_open_fn; - } else if (zend_string_equals_literal_ci(name, "xml")) { - return (zend_function*)&xmlreader_xml_fn; + zend_function *method = zend_std_get_method(obj, name, key); + if (method && (method->common.fn_flags & ZEND_ACC_STATIC) && method->common.type == ZEND_INTERNAL_FUNCTION) { + /* There are only two static internal methods and they both have overrides. */ + if (ZSTR_LEN(name) == sizeof("xml") - 1) { + return (zend_function *) &xmlreader_xml_fn; + } else { + ZEND_ASSERT(ZSTR_LEN(name) == sizeof("open") - 1); + return (zend_function *) &xmlreader_open_fn; + } } - return zend_std_get_method(obj, name, key); + return method; } /* }}} */ diff --git a/ext/xmlreader/tests/gh14183.phpt b/ext/xmlreader/tests/gh14183.phpt new file mode 100644 index 00000000000..2f3f81bd662 --- /dev/null +++ b/ext/xmlreader/tests/gh14183.phpt @@ -0,0 +1,24 @@ +--TEST-- +GH-14183 (XMLReader::open() can't be overridden) +--EXTENSIONS-- +xmlreader +--FILE-- +open('asdf')); +?> +--EXPECT-- +overridden +bool(true) +overridden +bool(true)