From: Rob Richards Date: Fri, 13 Mar 2009 13:41:42 +0000 (+0000) Subject: fix bug #47430 (Errors after writing to nodeValue parameter of an absent previousSibling) X-Git-Tag: php-5.2.10RC1~303 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e5a211bafc2d4a9d1853d01e1bff4f90efc51f18;p=php fix bug #47430 (Errors after writing to nodeValue parameter of an absent previousSibling) add test --- diff --git a/ext/dom/attr.c b/ext/dom/attr.c index 582cbbfcdc..f109ab0183 100644 --- a/ext/dom/attr.c +++ b/ext/dom/attr.c @@ -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 diff --git a/ext/dom/document.c b/ext/dom/document.c index 1927852a11..e87879d09d 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -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 diff --git a/ext/dom/node.c b/ext/dom/node.c index f9555d7b20..7ef12abf33 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); @@ -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 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-- + +--FILE-- +

Hello

World!

'; +$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 +)