]> granicus.if.org Git - php/commitdiff
fix bug #47430 (Errors after writing to nodeValue parameter of an absent previousSibling)
authorRob Richards <rrichards@php.net>
Fri, 13 Mar 2009 13:41:42 +0000 (13:41 +0000)
committerRob Richards <rrichards@php.net>
Fri, 13 Mar 2009 13:41:42 +0000 (13:41 +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 582cbbfcdc40e31a379ba32df27d5bc310a1e72f..f109ab018381b82521038339e8ba40664db21ef2 100644 (file)
@@ -29,7 +29,6 @@
 
 #include "php_dom.h"
 
-
 /* {{{ arginfo */
 static
 ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_attr_is_id, 0, 0, 0)
@@ -99,7 +98,6 @@ PHP_METHOD(domattr, __construct)
 
 /* }}} end DOMAttr::__construct */
 
-
 /* {{{ name    string  
 readonly=yes 
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-1112119403
@@ -124,8 +122,6 @@ int dom_attr_name_read(dom_object *obj, zval **retval TSRMLS_DC)
 
 /* }}} */
 
-
-
 /* {{{ specified       boolean 
 readonly=yes 
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-862529273
@@ -141,8 +137,6 @@ int dom_attr_specified_read(dom_object *obj, zval **retval TSRMLS_DC)
 
 /* }}} */
 
-
-
 /* {{{ value   string  
 readonly=no 
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-221662474
@@ -210,8 +204,6 @@ int dom_attr_value_write(dom_object *obj, zval *newval TSRMLS_DC)
 
 /* }}} */
 
-
-
 /* {{{ ownerElement    DOMElement      
 readonly=yes 
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Attr-ownerElement
@@ -229,13 +221,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;
@@ -246,8 +239,6 @@ int dom_attr_owner_element_read(dom_object *obj, zval **retval TSRMLS_DC)
 
 /* }}} */
 
-
-
 /* {{{ schemaTypeInfo  DOMTypeInfo     
 readonly=yes 
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Attr-schemaTypeInfo
@@ -263,8 +254,6 @@ int dom_attr_schema_type_info_read(dom_object *obj, zval **retval TSRMLS_DC)
 
 /* }}} */
 
-
-
 /* {{{ proto boolean dom_attr_is_id();
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Attr-isId
 Since: DOM Level 3
index 1927852a11a7b5ff63b56d9740d248496d780bfe..e87879d09db78c8336d0293fa3eabbeeb9b3aade 100644 (file)
@@ -283,12 +283,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,8 +301,6 @@ int dom_document_doctype_read(dom_object *obj, zval **retval TSRMLS_DC)
 
 /* }}} */
 
-
-
 /* {{{ implementation  DOMImplementation       
 readonly=yes 
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1B793EBA
@@ -315,8 +315,6 @@ int dom_document_implementation_read(dom_object *obj, zval **retval TSRMLS_DC)
 
 /* }}} */
 
-
-
 /* {{{ documentElement DOMElement      
 readonly=yes 
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-87CD092
@@ -335,12 +333,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;
@@ -421,8 +421,6 @@ int dom_document_encoding_write(dom_object *obj, zval *newval TSRMLS_DC)
 
 /* }}} */
 
-
-
 /* {{{ standalone      boolean 
 readonly=no 
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-standalone
@@ -487,8 +485,6 @@ int dom_document_standalone_write(dom_object *obj, zval *newval TSRMLS_DC)
 
 /* }}} */
 
-
-
 /* {{{ version string  
 readonly=no
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-version
index f9555d7b20bf6c77d34c9913aaafc506c3a21aa1..7ef12abf33e33d3598d40869d13036bdbbe81c53 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);
@@ -428,13 +427,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;
@@ -501,12 +501,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;
@@ -539,12 +540,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;
@@ -573,13 +575,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
+)