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 ---
+
+
+
+
+
+