1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Fix GH-20281: \Dom\Document::getElementById() is inconsistent after nodes are removed

This worked for non-parsed elements already, but not for elements where
xmlAddID() returns early due to the ID already existing.
In that case what was missing is marking the attribute as an ID.

Closes GH-20283.
This commit is contained in:
Niels Dossche
2025-10-24 21:17:00 +02:00
parent e9c9b1fdcf
commit cb1f9327c4
3 changed files with 21 additions and 1 deletions

2
NEWS
View File

@@ -15,6 +15,8 @@ PHP NEWS
- DOM:
. Partially fixed bug GH-16317 (DOM classes do not allow
__debugInfo() overrides to work). (nielsdos)
. Fixed bug GH-20281 (\Dom\Document::getElementById() is inconsistent
after nodes are removed). (nielsdos)
- Exif:
. Fix possible memory leak when tag is empty. (nielsdos)

View File

@@ -268,7 +268,10 @@ static lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert(
/* xmlIsID does some other stuff too that is irrelevant here. */
if (local_name_length == 2 && local_name[0] == 'i' && local_name[1] == 'd' && attr->node.ns == LXB_NS_HTML) {
xmlAddID(NULL, lxml_doc, value, lxml_attr);
if (xmlAddID(NULL, lxml_doc, value, lxml_attr) == 0) {
/* If the ID already exists, the ID attribute still needs to be marked as an ID. */
lxml_attr->atype = XML_ATTRIBUTE_ID;
}
}
/* libxml2 doesn't support line numbers on this anyway, it derives them instead, so don't bother */

View File

@@ -0,0 +1,15 @@
--TEST--
GH-20281 (\Dom\Document::getElementById() is inconsistent after nodes are removed)
--EXTENSIONS--
dom
--CREDITS--
cscott
--FILE--
<?php
$d = \Dom\HTMLDocument::createFromString('<p id="a">b</p><p id="a">c</p>', LIBXML_NOERROR);
$p = $d->getElementById('a');
$p->remove();
echo $d->getElementById('a')->textContent, "\n";
?>
--EXPECT--
c