Browse Source

fix bug #47430 (Errors after writing to nodeValue parameter of an absent previousSibling)

add test
PHP-5.2.1RC1
Rob Richards 18 years ago
parent
commit
e5a211bafc
  1. 19
      ext/dom/attr.c
  2. 20
      ext/dom/document.c
  3. 29
      ext/dom/node.c
  4. 30
      ext/dom/tests/bug47430.phpt

19
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

20
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

29
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;

30
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
)
Loading…
Cancel
Save