Skip to content

Commit 15813d6

Browse files
committed
Fix GH-14183: XMLReader::open() can't be overridden
We should only return the override if the internal static method is matched. Closes GH-14194.
1 parent 12dc519 commit 15813d6

File tree

3 files changed

+38
-13
lines changed

3 files changed

+38
-13
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ PHP NEWS
2929
. Fixed bug GH-14124 (Segmentation fault with XML extension under certain
3030
memory limit). (nielsdos)
3131

32+
- XMLReader:
33+
. Fixed bug GH-14183 (XMLReader::open() can't be overridden). (nielsdos)
34+
3235
09 May 2024, PHP 8.2.19
3336

3437
- Core:

ext/xmlreader/php_xmlreader.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -186,19 +186,17 @@ zval *xmlreader_write_property(zend_object *object, zend_string *name, zval *val
186186
/* {{{ */
187187
static zend_function *xmlreader_get_method(zend_object **obj, zend_string *name, const zval *key)
188188
{
189-
if (ZSTR_LEN(name) == sizeof("open") - 1
190-
&& (ZSTR_VAL(name)[0] == 'o' || ZSTR_VAL(name)[0] == 'O')
191-
&& (ZSTR_VAL(name)[1] == 'p' || ZSTR_VAL(name)[1] == 'P')
192-
&& (ZSTR_VAL(name)[2] == 'e' || ZSTR_VAL(name)[2] == 'E')
193-
&& (ZSTR_VAL(name)[3] == 'n' || ZSTR_VAL(name)[3] == 'N')) {
194-
return (zend_function*)&xmlreader_open_fn;
195-
} else if (ZSTR_LEN(name) == sizeof("xml") - 1
196-
&& (ZSTR_VAL(name)[0] == 'x' || ZSTR_VAL(name)[0] == 'X')
197-
&& (ZSTR_VAL(name)[1] == 'm' || ZSTR_VAL(name)[1] == 'M')
198-
&& (ZSTR_VAL(name)[2] == 'l' || ZSTR_VAL(name)[2] == 'L')) {
199-
return (zend_function*)&xmlreader_xml_fn;
200-
}
201-
return zend_std_get_method(obj, name, key);;
189+
zend_function *method = zend_std_get_method(obj, name, key);
190+
if (method && (method->common.fn_flags & ZEND_ACC_STATIC) && method->common.type == ZEND_INTERNAL_FUNCTION) {
191+
/* There are only two static internal methods and they both have overrides. */
192+
if (ZSTR_LEN(name) == sizeof("xml") - 1) {
193+
return (zend_function *) &xmlreader_xml_fn;
194+
} else {
195+
ZEND_ASSERT(ZSTR_LEN(name) == sizeof("open") - 1);
196+
return (zend_function *) &xmlreader_open_fn;
197+
}
198+
}
199+
return method;
202200
}
203201
/* }}} */
204202

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)