From 09481c642b59737096d25518a290d8a3bb710042 Mon Sep 17 00:00:00 2001 From: Rob Richards Date: Sun, 24 Aug 2003 10:23:43 +0000 Subject: [PATCH] implement stricterrorcheck fix clonenode cleanup error routines --- ext/dom/attr.c | 2 +- ext/dom/characterdata.c | 12 ++--- ext/dom/document.c | 40 +++++++++-------- ext/dom/domexception.c | 22 +++++---- ext/dom/domimplementation.c | 11 ++--- ext/dom/element.c | 23 +++++----- ext/dom/node.c | 89 ++++++++++++++++++------------------- ext/dom/php_dom.c | 19 +++++++- 8 files changed, 118 insertions(+), 100 deletions(-) diff --git a/ext/dom/attr.c b/ext/dom/attr.c index 6483a41647..3dc615a08e 100644 --- a/ext/dom/attr.c +++ b/ext/dom/attr.c @@ -185,7 +185,7 @@ int dom_attr_owner_element_read(dom_object *obj, zval **retval TSRMLS_DC) 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"); + php_error(E_WARNING, "Cannot create required DOM object"); return FAILURE; } return SUCCESS; diff --git a/ext/dom/characterdata.c b/ext/dom/characterdata.c index 67de2645a8..17b8faa5c7 100644 --- a/ext/dom/characterdata.c +++ b/ext/dom/characterdata.c @@ -150,8 +150,7 @@ PHP_FUNCTION(dom_characterdata_substring_data) if (offset < 0 || count < 0 || offset > length) { xmlFree(cur); - php_dom_throw_error(INDEX_SIZE_ERR, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index Size Error"); + php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } @@ -226,8 +225,7 @@ PHP_FUNCTION(dom_characterdata_insert_data) if (offset < 0 || offset > length) { xmlFree(cur); - php_dom_throw_error(INDEX_SIZE_ERR, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index Size Error"); + php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } @@ -274,8 +272,7 @@ PHP_FUNCTION(dom_characterdata_delete_data) if (offset < 0 || count < 0 || offset > length) { xmlFree(cur); - php_dom_throw_error(INDEX_SIZE_ERR, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index Size Error"); + php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } @@ -331,8 +328,7 @@ PHP_FUNCTION(dom_characterdata_replace_data) if (offset < 0 || count < 0 || offset > length) { xmlFree(cur); - php_dom_throw_error(INDEX_SIZE_ERR, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index Size Error"); + php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } diff --git a/ext/dom/document.c b/ext/dom/document.c index eea8b03b88..f6b9772524 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -118,8 +118,6 @@ static void php_dom_ctx_error(void *ctx, const char *msg, ...) { int len; xmlParserCtxtPtr parser; - TSRMLS_FETCH(); - parser = (xmlParserCtxtPtr) ctx; va_start(ap, msg); @@ -131,7 +129,7 @@ static void php_dom_ctx_error(void *ctx, const char *msg, ...) { buf[len] = '\0'; } - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s in %s, line: %d", buf, parser->input->filename, parser->input->line); + php_error(E_WARNING, "%s in %s, line: %d", buf, parser->input->filename, parser->input->line); efree(buf); } /* }}} end php_dom_ctx_error */ @@ -156,7 +154,7 @@ int dom_document_doctype_read(dom_object *obj, zval **retval TSRMLS_DC) 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"); + php_error(E_WARNING, "Cannot create required DOM object"); return FAILURE; } return SUCCESS; @@ -203,7 +201,7 @@ int dom_document_document_element_read(dom_object *obj, zval **retval TSRMLS_DC) 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"); + php_error(E_WARNING, "Cannot create required DOM object"); return FAILURE; } return SUCCESS; @@ -266,12 +264,12 @@ int dom_document_encoding_write(dom_object *obj, zval *newval TSRMLS_DC) xmlFree((xmlChar *)docp->encoding); } - docp->encoding = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval)); - charset = (int)xmlParseCharEncoding((const char*) docp->encoding); + charset = (int)xmlParseCharEncoding((const xmlChar *) Z_STRVAL_P(newval)); if (charset > 0) { + docp->encoding = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval)); return SUCCESS; } else { - /* TODO: ERROR XML_CHAR_ENCODING_ERROR */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Document Encoding"); } return SUCCESS; @@ -372,12 +370,23 @@ Since: DOM Level 3 int dom_document_strict_error_checking_read(dom_object *obj, zval **retval TSRMLS_DC) { ALLOC_ZVAL(*retval); - ZVAL_NULL(*retval); + if (obj->document) { + ZVAL_BOOL(*retval, obj->document->stricterror); + } else { + ZVAL_FALSE(*retval); + } return SUCCESS; } int dom_document_strict_error_checking_write(dom_object *obj, zval *newval TSRMLS_DC) { + int stricterror; + + if (obj->document && newval->type == IS_BOOL) { + stricterror = Z_LVAL_P(newval); + obj->document->stricterror = stricterror; + } + return SUCCESS; } @@ -826,8 +835,7 @@ PHP_FUNCTION(dom_document_create_element_ns) if (nodep != NULL) { xmlFreeNode(nodep); } - php_dom_throw_error(errorcode, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace"); + php_dom_throw_error(errorcode, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } @@ -892,8 +900,7 @@ PHP_FUNCTION(dom_document_create_attribute_ns) if (nodep != NULL) { xmlFreeProp((xmlAttrPtr) nodep); } - php_dom_throw_error(errorcode, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace"); + php_dom_throw_error(errorcode, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } @@ -1092,8 +1099,6 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source TSRMLS_DC) ctxt->validate = validate; ctxt->loadsubset = resolve_externals; ctxt->keepBlanks = keep_blanks; - if (ctxt->keepBlanks == 0) - ctxt->sax->ignorableWhitespace = ignorableWhitespace; ctxt->replaceEntities = substitute_ent; ctxt->vctxt.error = php_dom_ctx_error; @@ -1245,13 +1250,12 @@ PHP_FUNCTION(dom_document_savexml) /* Dump contents of Node */ DOM_GET_OBJ(node, nodep, xmlNodePtr, nodeobj); if (node->doc != docp) { - php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Node not from same document"); + php_dom_throw_error(WRONG_DOCUMENT_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } buf = xmlBufferCreate(); if (!buf) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not fetch buffer"); + php_error(E_WARNING, "Could not fetch buffer"); RETURN_FALSE; } diff --git a/ext/dom/domexception.c b/ext/dom/domexception.c index 377a7bc8fa..ed9a46310b 100644 --- a/ext/dom/domexception.c +++ b/ext/dom/domexception.c @@ -42,16 +42,11 @@ zend_function_entry php_dom_domexception_class_functions[] = { }; /* {{{ php_dom_throw_error */ -void php_dom_throw_error(int error_code, zval **retval TSRMLS_DC) +void php_dom_throw_error(int error_code, int strict_error TSRMLS_DC) { zval *dom_exception; char *error_message; - ALLOC_ZVAL(dom_exception); - Z_TYPE_P(dom_exception) = IS_OBJECT; - object_init_ex(dom_exception, dom_domexception_class_entry); - dom_exception->refcount = 1; - dom_exception->is_ref = 1; switch (error_code) { case INDEX_SIZE_ERR: @@ -106,9 +101,18 @@ void php_dom_throw_error(int error_code, zval **retval TSRMLS_DC) error_message = "Unhandled Error"; } - add_property_long(dom_exception, "code", error_code); - add_property_stringl(dom_exception, "message", error_message, strlen(error_message), 1); - EG(exception) = dom_exception; + if (strict_error == 1) { + ALLOC_ZVAL(dom_exception); + Z_TYPE_P(dom_exception) = IS_OBJECT; + object_init_ex(dom_exception, dom_domexception_class_entry); + dom_exception->refcount = 1; + dom_exception->is_ref = 1; + add_property_long(dom_exception, "code", error_code); + add_property_stringl(dom_exception, "message", error_message, strlen(error_message), 1); + EG(exception) = dom_exception; + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, error_message); + } } /* }}} end php_dom_throw_error */ #endif diff --git a/ext/dom/domimplementation.c b/ext/dom/domimplementation.c index c039f72eb0..6b476e5094 100644 --- a/ext/dom/domimplementation.c +++ b/ext/dom/domimplementation.c @@ -98,8 +98,7 @@ PHP_FUNCTION(dom_domimplementation_create_document_type) if (uri->opaque != NULL) { localname = xmlStrdup(uri->opaque); if (xmlStrchr(localname, (xmlChar) ':') != NULL) { - php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace"); + php_dom_throw_error(NAMESPACE_ERR, 1 TSRMLS_CC); xmlFreeURI(uri); xmlFree(localname); RETURN_FALSE; @@ -149,8 +148,7 @@ PHP_FUNCTION(dom_domimplementation_create_document) RETURN_FALSE; } if (doctype->doc != NULL) { - php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "DocumentType: Wrong Document"); + php_dom_throw_error(WRONG_DOCUMENT_ERR, 1 TSRMLS_CC); RETURN_FALSE; } } else { @@ -172,8 +170,7 @@ PHP_FUNCTION(dom_domimplementation_create_document) if (localname != NULL) { xmlFree(localname); } - php_dom_throw_error(errorcode, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace"); + php_dom_throw_error(errorcode, 1 TSRMLS_CC); RETURN_FALSE; } @@ -207,7 +204,7 @@ PHP_FUNCTION(dom_domimplementation_create_document) xmlFreeDoc(docp); xmlFree(localname); /* Need some type of error here */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unexpected Error"); + php_error(E_WARNING, "Unexpected Error"); RETURN_FALSE; } diff --git a/ext/dom/element.c b/ext/dom/element.c index 8e658e1f70..c8e1aae3c2 100644 --- a/ext/dom/element.c +++ b/ext/dom/element.c @@ -185,7 +185,7 @@ PHP_FUNCTION(dom_element_set_attribute) } if (dom_node_is_read_only(nodep) == SUCCESS) { - php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC); + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } @@ -207,7 +207,7 @@ PHP_FUNCTION(dom_element_set_attribute) /* {{{ proto dom_void dom_element_remove_attribute(string name); URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D6AC0F9 -Since: +Since: */ PHP_FUNCTION(dom_element_remove_attribute) { @@ -225,7 +225,7 @@ PHP_FUNCTION(dom_element_remove_attribute) } if (dom_node_is_read_only(nodep) == SUCCESS) { - php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC); + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } @@ -296,7 +296,7 @@ PHP_FUNCTION(dom_element_set_attribute_node) } if (dom_node_is_read_only(nodep) == SUCCESS) { - php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC); + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } @@ -357,7 +357,7 @@ PHP_FUNCTION(dom_element_remove_attribute_node) } if (dom_node_is_read_only(nodep) == SUCCESS) { - php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC); + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } @@ -500,7 +500,7 @@ PHP_FUNCTION(dom_element_set_attribute_ns) char *uri, *name; char *localname = NULL, *prefix = NULL; dom_object *intern; - int errorcode = 0; + int errorcode = 0, stricterror; DOM_GET_THIS_OBJ(elemp, id, xmlNodePtr, intern); @@ -508,8 +508,10 @@ PHP_FUNCTION(dom_element_set_attribute_ns) return; } + stricterror = dom_get_strict_error(intern->document); + if (dom_node_is_read_only(elemp) == SUCCESS) { - php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC); + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC); RETURN_FALSE; } @@ -543,8 +545,7 @@ PHP_FUNCTION(dom_element_set_attribute_ns) } if (errorcode != 0) { - php_dom_throw_error(errorcode, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace"); + php_dom_throw_error(errorcode, stricterror TSRMLS_CC); RETURN_FALSE; } @@ -577,7 +578,7 @@ PHP_FUNCTION(dom_element_remove_attribute_ns) } if (dom_node_is_read_only(nodep) == SUCCESS) { - php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC); + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } @@ -664,7 +665,7 @@ PHP_FUNCTION(dom_element_set_attribute_node_ns) } if (dom_node_is_read_only(nodep) == SUCCESS) { - php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC); + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } diff --git a/ext/dom/node.c b/ext/dom/node.c index ba20404124..6aabc5e1e9 100644 --- a/ext/dom/node.c +++ b/ext/dom/node.c @@ -194,7 +194,7 @@ int dom_node_node_value_write(dom_object *obj, zval *newval TSRMLS_DC) /* {{{ proto nodeType unsigned short readonly=yes URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-111237558 -Since: +Since: */ int dom_node_node_type_read(dom_object *obj, zval **retval TSRMLS_DC) { @@ -238,7 +238,7 @@ int dom_node_parent_node_read(dom_object *obj, zval **retval TSRMLS_DC) 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"); + php_error(E_WARNING, "Cannot create required DOM object"); return FAILURE; } return SUCCESS; @@ -311,7 +311,7 @@ int dom_node_first_child_read(dom_object *obj, zval **retval TSRMLS_DC) 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"); + php_error(E_WARNING, "Cannot create required DOM object"); return FAILURE; } return SUCCESS; @@ -344,7 +344,7 @@ int dom_node_last_child_read(dom_object *obj, zval **retval TSRMLS_DC) 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"); + php_error(E_WARNING, "Cannot create required DOM object"); return FAILURE; } return SUCCESS; @@ -374,7 +374,7 @@ int dom_node_previous_sibling_read(dom_object *obj, zval **retval TSRMLS_DC) 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"); + php_error(E_WARNING, "Cannot create required DOM object"); return FAILURE; } return SUCCESS; @@ -384,10 +384,10 @@ int dom_node_previous_sibling_read(dom_object *obj, zval **retval TSRMLS_DC) -/* {{{ proto nextSibling node +/* {{{ proto nextSibling node readonly=yes URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6AC54C2F -Since: +Since: */ int dom_node_next_sibling_read(dom_object *obj, zval **retval TSRMLS_DC) { @@ -404,7 +404,7 @@ int dom_node_next_sibling_read(dom_object *obj, zval **retval TSRMLS_DC) ALLOC_ZVAL(*retval); if (NULL == (*retval = php_dom_create_object(nextsib, &ret, NULL, *retval, obj TSRMLS_CC))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object"); + php_error(E_WARNING, "Cannot create required DOM object"); return FAILURE; } return SUCCESS; @@ -478,7 +478,7 @@ int dom_node_owner_document_read(dom_object *obj, zval **retval TSRMLS_DC) ALLOC_ZVAL(*retval); if (NULL == (*retval = php_dom_create_object((xmlNodePtr) docp, &ret, NULL, *retval, obj TSRMLS_CC))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object"); + php_error(E_WARNING, "Cannot create required DOM object"); return FAILURE; } return SUCCESS; @@ -586,9 +586,7 @@ int dom_node_prefix_write(dom_object *obj, zval *newval TSRMLS_DC) strcmp (strURI, DOM_XMLNS_NAMESPACE)) || (nodep->type == XML_ATTRIBUTE_NODE && !strcmp (nodep->name, "xmlns"))) { - /* TODO: throw error - find out how to without a return_value - php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC); */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace"); + php_dom_throw_error(NAMESPACE_ERR, dom_get_strict_error(obj->document) TSRMLS_CC); return FAILURE; } ns = xmlNewNs(NULL, nodep->ns->href, (xmlChar *)prefix); @@ -649,8 +647,8 @@ int dom_node_local_name_read(dom_object *obj, zval **retval TSRMLS_DC) -/* {{{ proto baseURI string -readonly=yes +/* {{{ proto baseURI string +readonly=yes URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-baseURI Since: DOM Level 3 */ @@ -704,14 +702,14 @@ int dom_node_text_content_write(dom_object *obj, zval *newval TSRMLS_DC) /* {{{ proto domnode dom_node_insert_before(node newChild, node refChild); URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727 -Since: +Since: */ PHP_FUNCTION(dom_node_insert_before) { zval *id, *node, *ref, *rv = NULL; xmlNodePtr child, new_child, parentp, refp; dom_object *intern, *childobj, *refpobj; - int ret; + int ret, stricterror; DOM_GET_THIS_OBJ(parentp, id, xmlNodePtr, intern); @@ -723,21 +721,21 @@ PHP_FUNCTION(dom_node_insert_before) new_child = NULL; - if (dom_node_is_read_only(parentp) == SUCCESS || + stricterror = dom_get_strict_error(intern->document); + + 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); + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror 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"); + php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror TSRMLS_CC); RETURN_FALSE; } if (child->doc != parentp->doc && child->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"); + php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror TSRMLS_CC); RETURN_FALSE; } @@ -749,8 +747,7 @@ PHP_FUNCTION(dom_node_insert_before) if (ref != NULL) { DOM_GET_OBJ(refp, ref, xmlNodePtr, refpobj); if (refp->parent != parentp) { - php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as refnode is not child of node"); + php_dom_throw_error(NOT_FOUND_ERR, stricterror TSRMLS_CC); RETURN_FALSE; } @@ -868,7 +865,7 @@ PHP_FUNCTION(dom_node_replace_child) zval *id, *newnode, *oldnode; xmlNodePtr children, newchild, oldchild, nodep; dom_object *intern, *newchildobj, *oldchildobj; - int foundoldchild = 0; + int foundoldchild = 0, stricterror; int ret; @@ -890,21 +887,21 @@ PHP_FUNCTION(dom_node_replace_child) RETURN_FALSE; } + stricterror = dom_get_strict_error(intern->document); + 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); + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror 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"); + php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror TSRMLS_CC); RETURN_FALSE; } if (dom_hierarchy(nodep, newchild) == FAILURE) { - php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error"); + php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror TSRMLS_CC); RETURN_FALSE; } @@ -931,7 +928,7 @@ PHP_FUNCTION(dom_node_replace_child) DOM_RET_OBJ(rv, oldchild, &ret, intern); return; } else { - php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC); + php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } @@ -948,7 +945,7 @@ PHP_FUNCTION(dom_node_remove_child) zval *id, *node; xmlNodePtr children, child, nodep; dom_object *intern, *childobj; - int ret; + int ret, stricterror; DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern); @@ -962,15 +959,17 @@ PHP_FUNCTION(dom_node_remove_child) DOM_GET_OBJ(child, node, xmlNodePtr, childobj); + stricterror = dom_get_strict_error(intern->document); + 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); + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC); RETURN_FALSE; } children = nodep->children; if (!children) { - php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC); + php_dom_throw_error(NOT_FOUND_ERR, stricterror TSRMLS_CC); RETURN_FALSE; } @@ -984,7 +983,7 @@ PHP_FUNCTION(dom_node_remove_child) children = children->next; } - php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC); + php_dom_throw_error(NOT_FOUND_ERR, stricterror TSRMLS_CC); RETURN_FALSE } /* }}} end dom_node_remove_child */ @@ -1000,7 +999,7 @@ PHP_FUNCTION(dom_node_append_child) xmlNodePtr child, nodep, new_child = NULL; dom_object *intern, *childobj; xmlNsPtr nsptr; - int ret; + int ret, stricterror; DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern); @@ -1014,21 +1013,21 @@ PHP_FUNCTION(dom_node_append_child) DOM_GET_OBJ(child, node, xmlNodePtr, childobj); - if (dom_node_is_read_only(nodep) == SUCCESS || + stricterror = dom_get_strict_error(intern->document); + + 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); + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror 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"); + php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror TSRMLS_CC); RETURN_FALSE; } if (!(child->doc == NULL || child->doc == nodep->doc)) { - php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't append node, which is in a different document than the parent node"); + php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror TSRMLS_CC); RETURN_FALSE; } @@ -1083,7 +1082,7 @@ PHP_FUNCTION(dom_node_append_child) new_child = xmlAddChild(nodep, child); if (new_child == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't append node"); + php_error(E_WARNING, "Couldn't append node"); RETURN_FALSE; } @@ -1147,7 +1146,7 @@ PHP_FUNCTION(dom_node_clone_node) return; } - node = xmlCopyNode(n, recursive); + node = xmlDocCopyNode(n, n->doc, recursive); if (!node) { RETURN_FALSE; } @@ -1351,7 +1350,7 @@ PHP_FUNCTION(dom_node_lookup_namespace_uri) RETURN_STRING((char *) nsptr->href, 1); } } - + RETURN_NULL(); } /* }}} end dom_node_lookup_namespace_uri */ diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index de02f9cfee..bf67c5223d 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -88,7 +88,11 @@ int dom_node_is_read_only(xmlNodePtr node) { return SUCCESS; break; default: - return FAILURE; + if (node->doc == NULL) { + return SUCCESS; + } else { + return FAILURE; + } } } /* }}} end dom_node_is_read_only */ @@ -110,6 +114,14 @@ int dom_node_children_valid(xmlNodePtr node) { } /* }}} end dom_node_children_valid */ +int dom_get_strict_error(dom_ref_obj *document) { + if (document) { + return document->stricterror; + } else { + return 1; + } +} + /* {{{ int increment_document_reference(dom_object *object) */ int increment_document_reference(dom_object *object, xmlDocPtr docp TSRMLS_DC) { int ret_refcount = -1; @@ -122,6 +134,7 @@ int increment_document_reference(dom_object *object, xmlDocPtr docp TSRMLS_DC) { object->document = emalloc(sizeof(dom_ref_obj)); object->document->ptr = docp; object->document->refcount = ret_refcount; + object->document->stricterror = 1; } return ret_refcount; @@ -344,6 +357,10 @@ void dom_write_property(zval *object, zval *member, zval *value TSRMLS_DC) } if (ret == SUCCESS) { hnd->write_func(obj, value TSRMLS_CC); + if (! PZVAL_IS_REF(value) && value->refcount == 0) { + value->refcount++; + zval_ptr_dtor(&value); + } } else { std_hnd = zend_get_std_object_handlers(); std_hnd->write_property(object, member, value TSRMLS_CC); -- 2.50.0