Browse Source

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

add test
experimental/5.3-FPM
Rob Richards 18 years ago
parent
commit
63ccee5b41
  1. 7
      ext/dom/attr.c
  2. 12
      ext/dom/document.c
  3. 29
      ext/dom/node.c
  4. 30
      ext/dom/tests/bug47430.phpt

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

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

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);
@ -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;

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