From 92f960dc496ac1ebca8718ddf3a507866f5b6157 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Sat, 22 Jul 2023 19:05:09 +0200 Subject: [PATCH] Fix empty argument cases for DOMParentNode methods --- ext/dom/characterdata.c | 12 +-- ext/dom/document.c | 8 +- ext/dom/documentfragment.c | 8 +- ext/dom/element.c | 20 ++--- .../tests/DOMParentNode_empty_argument.phpt | 84 +++++++++++++++++++ 5 files changed, 108 insertions(+), 24 deletions(-) create mode 100644 ext/dom/tests/DOMParentNode_empty_argument.phpt diff --git a/ext/dom/characterdata.c b/ext/dom/characterdata.c index 85660a7b3549f..9bbe18b4b8889 100644 --- a/ext/dom/characterdata.c +++ b/ext/dom/characterdata.c @@ -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(); } @@ -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(); } @@ -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(); } diff --git a/ext/dom/document.c b/ext/dom/document.c index 93091df83a04f..71e12b6e7a95d 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -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(); } @@ -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(); } diff --git a/ext/dom/documentfragment.c b/ext/dom/documentfragment.c index 4e7f76a7de80a..2c9c6f75bd9b3 100644 --- a/ext/dom/documentfragment.c +++ b/ext/dom/documentfragment.c @@ -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(); } @@ -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(); } diff --git a/ext/dom/element.c b/ext/dom/element.c index 44c576a07363f..5aab76eba94ee 100644 --- a/ext/dom/element.c +++ b/ext/dom/element.c @@ -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(); } @@ -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(); } @@ -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(); } @@ -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(); } @@ -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(); } diff --git a/ext/dom/tests/DOMParentNode_empty_argument.phpt b/ext/dom/tests/DOMParentNode_empty_argument.phpt new file mode 100644 index 0000000000000..8274b20add690 --- /dev/null +++ b/ext/dom/tests/DOMParentNode_empty_argument.phpt @@ -0,0 +1,84 @@ +--TEST-- +DOMParentNode functions with empty argument +--EXTENSIONS-- +dom +--FILE-- +loadXML(''); + +$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 --- + + + + + +--- DOMDocumentFragment test --- + +--- DOMDocument test --- + + +--- DOMCharacterData test --- + + + + + +