summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Richards <rrichards@php.net>2009-03-13 13:43:29 +0000
committerRob Richards <rrichards@php.net>2009-03-13 13:43:29 +0000
commit63ccee5b41d0824b809d22e3f9ca1745e07609f5 (patch)
tree704b33374b62908e8ac0fef2f2905b4f94714bd3
parent0934fc996d57f3088e9a31f125bf357f72401571 (diff)
downloadphp-git-63ccee5b41d0824b809d22e3f9ca1745e07609f5.tar.gz
MFB: fix bug #47430 (Errors after writing to nodeValue parameter of an absent previousSibling)
add test
-rw-r--r--ext/dom/attr.c7
-rw-r--r--ext/dom/document.c12
-rw-r--r--ext/dom/node.c29
-rw-r--r--ext/dom/tests/bug47430.phpt30
4 files changed, 58 insertions, 20 deletions
diff --git a/ext/dom/attr.c b/ext/dom/attr.c
index 00088f0157..5c7252f710 100644
--- a/ext/dom/attr.c
+++ b/ext/dom/attr.c
@@ -220,13 +220,14 @@ int dom_attr_owner_element_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
+ ALLOC_ZVAL(*retval);
+
nodeparent = nodep->parent;
if (!nodeparent) {
- return FAILURE;
+ ZVAL_NULL(*retval);
+ return SUCCESS;
}
- ALLOC_ZVAL(*retval);
-
if (NULL == (*retval = php_dom_create_object(nodeparent, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
diff --git a/ext/dom/document.c b/ext/dom/document.c
index bdb58497b9..2b6ce169e8 100644
--- a/ext/dom/document.c
+++ b/ext/dom/document.c
@@ -251,12 +251,14 @@ int dom_document_doctype_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
+ ALLOC_ZVAL(*retval);
+
dtdptr = xmlGetIntSubset(docp);
if (!dtdptr) {
- return FAILURE;
+ ZVAL_NULL(*retval);
+ return SUCCESS;
}
- ALLOC_ZVAL(*retval);
if (NULL == (*retval = php_dom_create_object((xmlNodePtr) dtdptr, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
@@ -299,12 +301,14 @@ int dom_document_document_element_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
+ ALLOC_ZVAL(*retval);
+
root = xmlDocGetRootElement(docp);
if (!root) {
- return FAILURE;
+ ZVAL_NULL(*retval);
+ return SUCCESS;
}
- ALLOC_ZVAL(*retval);
if (NULL == (*retval = php_dom_create_object(root, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
diff --git a/ext/dom/node.c b/ext/dom/node.c
index e2ad8a31d5..bdb3c6cb8e 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -260,7 +260,6 @@ int dom_node_node_name_read(dom_object *obj, zval **retval TSRMLS_DC)
break;
default:
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Node Type");
- return FAILURE;
}
ALLOC_ZVAL(*retval);
@@ -422,13 +421,14 @@ int dom_node_parent_node_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
+ ALLOC_ZVAL(*retval);
+
nodeparent = nodep->parent;
if (!nodeparent) {
- return FAILURE;
+ ZVAL_NULL(*retval);
+ return SUCCESS;
}
- ALLOC_ZVAL(*retval);
-
if (NULL == (*retval = php_dom_create_object(nodeparent, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
@@ -491,12 +491,13 @@ int dom_node_first_child_read(dom_object *obj, zval **retval TSRMLS_DC)
first = nodep->children;
}
+ ALLOC_ZVAL(*retval);
+
if (!first) {
- return FAILURE;
+ ZVAL_NULL(*retval);
+ return SUCCESS;
}
- ALLOC_ZVAL(*retval);
-
if (NULL == (*retval = php_dom_create_object(first, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
@@ -527,12 +528,13 @@ int dom_node_last_child_read(dom_object *obj, zval **retval TSRMLS_DC)
last = nodep->last;
}
+ ALLOC_ZVAL(*retval);
+
if (!last) {
- return FAILURE;
+ ZVAL_NULL(*retval);
+ return SUCCESS;
}
- ALLOC_ZVAL(*retval);
-
if (NULL == (*retval = php_dom_create_object(last, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
@@ -559,13 +561,14 @@ int dom_node_previous_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
+ ALLOC_ZVAL(*retval);
+
prevsib = nodep->prev;
if (!prevsib) {
- return FAILURE;
+ ZVAL_NULL(*retval);
+ return SUCCESS;
}
- ALLOC_ZVAL(*retval);
-
if (NULL == (*retval = php_dom_create_object(prevsib, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
diff --git a/ext/dom/tests/bug47430.phpt b/ext/dom/tests/bug47430.phpt
new file mode 100644
index 0000000000..d3ca435e5f
--- /dev/null
+++ b/ext/dom/tests/bug47430.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #47430 (Errors after writing to nodeValue parameter of an absent previousSibling).
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+$xml = '<?xml
+version="1.0"?><html><p><i>Hello</i></p><p><i>World!</i></p></html>';
+$dom = new DOMDocument();
+$dom->loadXML($xml);
+
+$elements = $dom->getElementsByTagName('i');
+foreach ($elements as $i) {
+ $i->previousSibling->nodeValue = '';
+}
+
+$arr = array();
+$arr[0] = 'Value';
+
+print_r($arr);
+
+?>
+--EXPECTF--
+Strict Standards: Creating default object from empty value in %s on line %d
+
+Strict Standards: Creating default object from empty value in %s on line %d
+Array
+(
+ [0] => Value
+)