]> granicus.if.org Git - php/commitdiff
MFB: fix bug #47430 (Errors after writing to nodeValue parameter of an absent previou...
authorRob Richards <rrichards@php.net>
Fri, 13 Mar 2009 13:43:29 +0000 (13:43 +0000)
committerRob Richards <rrichards@php.net>
Fri, 13 Mar 2009 13:43:29 +0000 (13:43 +0000)
add test

ext/dom/attr.c
ext/dom/document.c
ext/dom/node.c
ext/dom/tests/bug47430.phpt [new file with mode: 0644]

index 00088f015728ef21ee0d908de8a5214b111e0b3d..5c7252f71090daaf20382bccb882f51249314cfd 100644 (file)
@@ -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;
index bdb58497b9db3361fdd747d6846307b75166e588..2b6ce169e8fa6c88fa6060d276fb5b79c7cd3379 100644 (file)
@@ -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;
index e2ad8a31d5dd0ebcbfbaeb5e1f1bb2e3e95b0e9f..bdb3c6cb8eb5db8d7ddfb27d1ea00f5cb645bcb8 100644 (file)
@@ -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 (file)
index 0000000..d3ca435
--- /dev/null
@@ -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
+)