Skip to content

Commit

Permalink
Fix empty argument cases for DOMParentNode methods
Browse files Browse the repository at this point in the history
Closes GH-11768.
  • Loading branch information
nielsdos committed Jul 24, 2023
1 parent 1cf2d21 commit abb1d2e
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 24 deletions.
1 change: 1 addition & 0 deletions NEWS
Expand Up @@ -11,6 +11,7 @@ PHP NEWS
. Fix incorrect attribute existence check in DOMElement::setAttributeNodeNS.
(nielsdos)
. Fix DOMCharacterData::replaceWith() with itself. (nielsdos)
. Fix empty argument cases for DOMParentNode methods. (nielsdos)

- FFI:
. Fix leaking definitions when using FFI::cdef()->new(...). (ilutov)
Expand Down
12 changes: 6 additions & 6 deletions ext/dom/characterdata.c
Expand Up @@ -364,12 +364,12 @@ PHP_METHOD(DOMCharacterData, remove)

PHP_METHOD(DOMCharacterData, after)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand All @@ -381,12 +381,12 @@ PHP_METHOD(DOMCharacterData, after)

PHP_METHOD(DOMCharacterData, before)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand All @@ -398,12 +398,12 @@ PHP_METHOD(DOMCharacterData, before)

PHP_METHOD(DOMCharacterData, replaceWith)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand Down
8 changes: 4 additions & 4 deletions ext/dom/document.c
Expand Up @@ -2092,12 +2092,12 @@ Since: DOM Living Standard (DOM4)
*/
PHP_METHOD(DOMDocument, append)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand All @@ -2113,12 +2113,12 @@ Since: DOM Living Standard (DOM4)
*/
PHP_METHOD(DOMDocument, prepend)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand Down
8 changes: 4 additions & 4 deletions ext/dom/documentfragment.c
Expand Up @@ -135,12 +135,12 @@ Since: DOM Living Standard (DOM4)
*/
PHP_METHOD(DOMDocumentFragment, append)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand All @@ -156,12 +156,12 @@ Since: DOM Living Standard (DOM4)
*/
PHP_METHOD(DOMDocumentFragment, prepend)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand Down
20 changes: 10 additions & 10 deletions ext/dom/element.c
Expand Up @@ -1137,12 +1137,12 @@ PHP_METHOD(DOMElement, remove)

PHP_METHOD(DOMElement, after)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand All @@ -1154,12 +1154,12 @@ PHP_METHOD(DOMElement, after)

PHP_METHOD(DOMElement, before)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand All @@ -1174,12 +1174,12 @@ Since: DOM Living Standard (DOM4)
*/
PHP_METHOD(DOMElement, append)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand All @@ -1195,12 +1195,12 @@ Since: DOM Living Standard (DOM4)
*/
PHP_METHOD(DOMElement, prepend)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand All @@ -1216,12 +1216,12 @@ Since: DOM Living Standard (DOM4)
*/
PHP_METHOD(DOMElement, replaceWith)
{
int argc;
int argc = 0;
zval *args, *id;
dom_object *intern;
xmlNode *context;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &args, &argc) == FAILURE) {
RETURN_THROWS();
}

Expand Down
84 changes: 84 additions & 0 deletions ext/dom/tests/DOMParentNode_empty_argument.phpt
@@ -0,0 +1,84 @@
--TEST--
DOMParentNode functions with empty argument
--EXTENSIONS--
dom
--FILE--
<?php
$dom = new DOMDocument();
$dom->loadXML('<?xml version="1.0"?><root><node/></root>');

$emptyFragment = $dom->createDocumentFragment();

echo "--- DOMElement test ---\n";

$dom->documentElement->after(...$emptyFragment->childNodes);
$dom->documentElement->before(...$emptyFragment->childNodes);
$dom->documentElement->append(...$emptyFragment->childNodes);
$dom->documentElement->prepend(...$emptyFragment->childNodes);
$dom->documentElement->after();
$dom->documentElement->before();
$dom->documentElement->append();
$dom->documentElement->prepend();
echo $dom->saveXML();

$dom->documentElement->firstChild->replaceWith(...$emptyFragment->childNodes);
echo $dom->saveXML();

$dom->documentElement->replaceWith(...$emptyFragment->childNodes);
echo $dom->saveXML();

echo "--- DOMDocumentFragment test ---\n";

$fragment = $dom->createDocumentFragment();
$fragment->append($dom->createElement('foo'));
$fragment->append(...$emptyFragment->childNodes);
$fragment->prepend(...$emptyFragment->childNodes);
$fragment->append();
$fragment->prepend();
echo $dom->saveXML($fragment), "\n";

echo "--- DOMDocument test ---\n";

$dom->append(...$emptyFragment->childNodes);
$dom->prepend(...$emptyFragment->childNodes);
$dom->append();
$dom->prepend();
echo $dom->saveXML(), "\n";

echo "--- DOMCharacterData test ---\n";

$cdata = $dom->createCDATASection('foo');
$dom->appendChild($cdata);

$cdata->after(...$emptyFragment->childNodes);
$cdata->before(...$emptyFragment->childNodes);
$cdata->after();
$cdata->before();
echo $dom->saveXML(), "\n";
$cdata->replaceWith(...$emptyFragment->childNodes);
echo $dom->saveXML(), "\n";

$cdata = $dom->createCDATASection('foo');
$dom->appendChild($cdata);
$cdata->replaceWith(...$emptyFragment->childNodes);
echo $dom->saveXML(), "\n";
?>
--EXPECT--
--- DOMElement test ---
<?xml version="1.0"?>
<root><node/></root>
<?xml version="1.0"?>
<root/>
<?xml version="1.0"?>
--- DOMDocumentFragment test ---
<foo/>
--- DOMDocument test ---
<?xml version="1.0"?>

--- DOMCharacterData test ---
<?xml version="1.0"?>
<![CDATA[foo]]>

<?xml version="1.0"?>

<?xml version="1.0"?>

0 comments on commit abb1d2e

Please sign in to comment.