Skip to content

Commit 94479fe

Browse files
committed
Merge branch 'PHP-8.3'
* PHP-8.3: Fix GH-14183: XMLReader::open() can't be overridden
2 parents 8276560 + d2970cc commit 94479fe

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

ext/xmlreader/php_xmlreader.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,12 +162,17 @@ zval *xmlreader_write_property(zend_object *object, zend_string *name, zval *val
162162
/* {{{ */
163163
static zend_function *xmlreader_get_method(zend_object **obj, zend_string *name, const zval *key)
164164
{
165-
if (zend_string_equals_literal_ci(name, "open")) {
166-
return (zend_function*)&xmlreader_open_fn;
167-
} else if (zend_string_equals_literal_ci(name, "xml")) {
168-
return (zend_function*)&xmlreader_xml_fn;
165+
zend_function *method = zend_std_get_method(obj, name, key);
166+
if (method && (method->common.fn_flags & ZEND_ACC_STATIC) && method->common.type == ZEND_INTERNAL_FUNCTION) {
167+
/* There are only two static internal methods and they both have overrides. */
168+
if (ZSTR_LEN(name) == sizeof("xml") - 1) {
169+
return (zend_function *) &xmlreader_xml_fn;
170+
} else {
171+
ZEND_ASSERT(ZSTR_LEN(name) == sizeof("open") - 1);
172+
return (zend_function *) &xmlreader_open_fn;
173+
}
169174
}
170-
return zend_std_get_method(obj, name, key);
175+
return method;
171176
}
172177
/* }}} */
173178

ext/xmlreader/tests/gh14183.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
GH-14183 (XMLReader::open() can't be overridden)
3+
--EXTENSIONS--
4+
xmlreader
5+
--FILE--
6+
<?php
7+
class MyXMLReader extends XMLReader
8+
{
9+
public static function open(string $uri, string $encoding = null, int $flags = 0): bool|\XMLReader
10+
{
11+
echo 'overridden', PHP_EOL;
12+
return true;
13+
}
14+
}
15+
16+
var_dump(MyXMLReader::open('asdf'));
17+
$o = new MyXMLReader;
18+
var_dump($o->open('asdf'));
19+
?>
20+
--EXPECT--
21+
overridden
22+
bool(true)
23+
overridden
24+
bool(true)

0 commit comments

Comments
 (0)