Skip to content

Commit

Permalink
Fix GH-12167 and GH-12169: Unable to get comment or processing instru…
Browse files Browse the repository at this point in the history
…ction contents in SimpleXML

Closes GH-12289.
  • Loading branch information
nielsdos committed Sep 25, 2023
1 parent d65c800 commit 82a84d0
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 1 deletion.
4 changes: 4 additions & 0 deletions NEWS
Expand Up @@ -35,6 +35,10 @@ PHP NEWS
. Fixed bug GH-12208 (SimpleXML infinite loop when a cast is used inside a
foreach). (nielsdos)
. Fixed bug #55098 (SimpleXML iteration produces infinite loop). (nielsdos)
. Fixed bug GH-12167 (Unable to get processing instruction contents in
SimpleXML). (nielsdos)
. Fixed bug GH-12169 (Unable to get comment contents in SimpleXML).
(nielsdos)

- Streams:
. Fixed bug GH-12190 (binding ipv4 address with both address and port at 0).
Expand Down
6 changes: 5 additions & 1 deletion ext/simplexml/simplexml.c
Expand Up @@ -1835,6 +1835,7 @@ static int sxe_object_cast_ex(zend_object *readobj, zval *writeobj, int type)
{
php_sxe_object *sxe;
xmlChar *contents = NULL;
bool free_contents = true;
xmlNodePtr node;
int rv;

Expand Down Expand Up @@ -1865,13 +1866,16 @@ static int sxe_object_cast_ex(zend_object *readobj, zval *writeobj, int type)
if (sxe->node && sxe->node->node) {
if (sxe->node->node->children) {
contents = xmlNodeListGetString((xmlDocPtr) sxe->document->ptr, sxe->node->node->children, 1);
} else if (sxe->node->node->type == XML_COMMENT_NODE || sxe->node->node->type == XML_PI_NODE) {
contents = sxe->node->node->content;
free_contents = false;
}
}
}

rv = cast_object(writeobj, type, (char *)contents);

if (contents) {
if (contents && free_contents) {
xmlFree(contents);
}

Expand Down
23 changes: 23 additions & 0 deletions ext/simplexml/tests/gh12167.phpt
@@ -0,0 +1,23 @@
--TEST--
GH-12167 (Unable to get processing instruction contents in SimpleXML)
--EXTENSIONS--
simplexml
--FILE--
<?php

$xml = <<<XML
<?xml version="1.0"?>
<container>
<?foo pi contents ?>
</container>
XML;

$sxe = simplexml_load_string($xml);

var_dump($sxe->xpath("//processing-instruction()")[0]->getName());
var_dump((string) $sxe->xpath("//processing-instruction()")[0]);

?>
--EXPECT--
string(3) "foo"
string(12) "pi contents "
23 changes: 23 additions & 0 deletions ext/simplexml/tests/gh12169.phpt
@@ -0,0 +1,23 @@
--TEST--
GH-12169 (Unable to get comment contents in SimpleXML)
--EXTENSIONS--
simplexml
--FILE--
<?php

$xml = <<<XML
<?xml version="1.0"?>
<container>
<!-- comment contents -->
</container>
XML;

$sxe = simplexml_load_string($xml);

var_dump($sxe->xpath("//comment()")[0]->getName());
var_dump((string) $sxe->xpath("//comment()")[0]);

?>
--EXPECT--
string(7) "comment"
string(18) " comment contents "

0 comments on commit 82a84d0

Please sign in to comment.