summaryrefslogtreecommitdiff
path: root/ext/dom/node.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/dom/node.c')
-rw-r--r--ext/dom/node.c94
1 files changed, 76 insertions, 18 deletions
diff --git a/ext/dom/node.c b/ext/dom/node.c
index 87b0cff72f..2faedfee80 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -154,7 +154,7 @@ currently here as a convience method while developing */
ZVAL_STRING(*retval, str, 1);
xmlFree(str);
} else {
- ZVAL_EMPTY_STRING(*retval);
+ ZVAL_NULL(*retval);
}
@@ -202,7 +202,14 @@ int dom_node_node_type_read(dom_object *obj, zval **retval TSRMLS_DC)
nodep = dom_object_get_node(obj);
ALLOC_ZVAL(*retval);
- ZVAL_LONG(*retval, nodep->type);
+
+ /* Specs dictate that they are both type XML_DOCUMENT_TYPE_NODE */
+ if (nodep->type == XML_DTD_NODE) {
+ ZVAL_LONG(*retval, XML_DOCUMENT_TYPE_NODE);
+ } else {
+ ZVAL_LONG(*retval, nodep->type);
+ }
+
return SUCCESS;
}
@@ -252,23 +259,27 @@ int dom_node_child_nodes_read(dom_object *obj, zval **retval TSRMLS_DC)
nodep = dom_object_get_node(obj);
- if ((nodep->type == XML_DOCUMENT_NODE) || (nodep->type == XML_HTML_DOCUMENT_NODE)) {
- last = ((xmlDoc *) nodep)->children;
+ if (dom_node_children_valid(nodep) == SUCCESS) {
+ if ((nodep->type == XML_DOCUMENT_NODE) || (nodep->type == XML_HTML_DOCUMENT_NODE)) {
+ last = ((xmlDoc *) nodep)->children;
+ } else {
+ last = nodep->children;
+ }
} else {
- last = nodep->children;
+ last = NULL;
}
+
MAKE_STD_ZVAL(*retval);
array_init(*retval);
- if (last) {
- while (last) {
- zval *child;
- MAKE_STD_ZVAL(child);
- child = php_dom_create_object(last, &ret, NULL, child, obj TSRMLS_CC);
- add_next_index_zval(*retval, child);
- last = last->next;
- }
+ while (last) {
+ zval *child;
+ MAKE_STD_ZVAL(child);
+ child = php_dom_create_object(last, &ret, NULL, child, obj TSRMLS_CC);
+ add_next_index_zval(*retval, child);
+ last = last->next;
}
+
return SUCCESS;
}
@@ -283,12 +294,15 @@ Since:
*/
int dom_node_first_child_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- xmlNode *nodep, *first;
+ xmlNode *nodep, *first = NULL;
int ret;
nodep = dom_object_get_node(obj);
- first = nodep->children;
+ if (dom_node_children_valid(nodep) == SUCCESS) {
+ first = nodep->children;
+ }
+
if (!first) {
return FAILURE;
}
@@ -313,12 +327,15 @@ Since:
*/
int dom_node_last_child_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- xmlNode *nodep, *last;
+ xmlNode *nodep, *last = NULL;
int ret;
nodep = dom_object_get_node(obj);
- last = nodep->last;
+ if (dom_node_children_valid(nodep) == SUCCESS) {
+ last = nodep->last;
+ }
+
if (!last) {
return FAILURE;
}
@@ -499,7 +516,7 @@ int dom_node_namespace_uri_read(dom_object *obj, zval **retval TSRMLS_DC)
if(str != NULL) {
ZVAL_STRING(*retval, str, 1);
} else {
- ZVAL_EMPTY_STRING(*retval);
+ ZVAL_NULL(*retval);
}
return SUCCESS;
@@ -709,6 +726,12 @@ PHP_FUNCTION(dom_node_insert_before)
new_child = NULL;
+ if (dom_node_is_read_only(parentp) == SUCCESS ||
+ (child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
+ php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
+ RETURN_FALSE;
+ }
+
if (dom_hierarchy(parentp, child) == FAILURE) {
php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error");
@@ -854,6 +877,10 @@ PHP_FUNCTION(dom_node_replace_child)
DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
+ if (dom_node_children_valid(nodep) == FAILURE) {
+ RETURN_FALSE;
+ }
+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "oo", &newnode, &oldnode) == FAILURE) {
return;
}
@@ -866,6 +893,12 @@ PHP_FUNCTION(dom_node_replace_child)
RETURN_FALSE;
}
+ if (dom_node_is_read_only(nodep) == SUCCESS ||
+ (newchild->parent != NULL && dom_node_is_read_only(newchild->parent) == SUCCESS)) {
+ php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
+ RETURN_FALSE;
+ }
+
if (newchild->doc != nodep->doc && newchild->doc != NULL) {
php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as it was created from a different document");
@@ -892,6 +925,7 @@ PHP_FUNCTION(dom_node_replace_child)
if (oldchild != newchild) {
xmlNodePtr node;
if (newchild->doc == NULL && nodep->doc != NULL) {
+ xmlSetTreeDoc(newchild, nodep->doc);
newchildobj->document = intern->document;
increment_document_reference(newchildobj, NULL TSRMLS_CC);
}
@@ -925,8 +959,18 @@ PHP_FUNCTION(dom_node_remove_child)
return;
}
+ if (dom_node_children_valid(nodep) == FAILURE) {
+ RETURN_FALSE;
+ }
+
DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
+ if (dom_node_is_read_only(nodep) == SUCCESS ||
+ (child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
+ php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
+ RETURN_FALSE;
+ }
+
children = nodep->children;
if (!children) {
php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC);
@@ -966,8 +1010,18 @@ PHP_FUNCTION(dom_node_append_child)
return;
}
+ if (dom_node_children_valid(nodep) == FAILURE) {
+ RETURN_FALSE;
+ }
+
DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
+ if (dom_node_is_read_only(nodep) == SUCCESS ||
+ (child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
+ php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
+ RETURN_FALSE;
+ }
+
if (dom_hierarchy(nodep, child) == FAILURE) {
php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error");
@@ -1053,6 +1107,10 @@ PHP_FUNCTION(dom_node_has_child_nodes)
DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
DOM_NO_ARGS();
+
+ if (dom_node_children_valid(nodep) == FAILURE) {
+ RETURN_FALSE;
+ }
if (nodep->children) {
RETURN_TRUE;