diff options
author | Rob Richards <rrichards@php.net> | 2009-03-13 13:43:29 +0000 |
---|---|---|
committer | Rob Richards <rrichards@php.net> | 2009-03-13 13:43:29 +0000 |
commit | 63ccee5b41d0824b809d22e3f9ca1745e07609f5 (patch) | |
tree | 704b33374b62908e8ac0fef2f2905b4f94714bd3 | |
parent | 0934fc996d57f3088e9a31f125bf357f72401571 (diff) | |
download | php-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.c | 7 | ||||
-rw-r--r-- | ext/dom/document.c | 12 | ||||
-rw-r--r-- | ext/dom/node.c | 29 | ||||
-rw-r--r-- | ext/dom/tests/bug47430.phpt | 30 |
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 +) |