chregu Sun Jan 18 07:56:24 2004 EDT Modified files: /php-src/ext/dom document.c Log: - fix for bug #26947 Crash by using DomDocument::getElementById() Index: php-src/ext/dom/document.c diff -u php-src/ext/dom/document.c:1.43 php-src/ext/dom/document.c:1.44 --- php-src/ext/dom/document.c:1.43 Thu Jan 8 03:15:16 2004 +++ php-src/ext/dom/document.c Sun Jan 18 07:56:23 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: document.c,v 1.43 2004/01/08 08:15:16 andi Exp $ */ +/* $Id: document.c,v 1.44 2004/01/18 12:56:23 chregu Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -41,15 +41,6 @@ #define DOM_LOAD_STRING 0 #define DOM_LOAD_FILE 1 -static void idsHashScanner(void *payload, void *data, xmlChar *name) -{ - idsIterator *priv = (idsIterator *) data; - - if (priv->element == NULL && xmlStrEqual (name, priv->elementId)) { - priv->element = ((xmlNode *)((xmlID *)payload)->attr)->parent; - } -} - /* * class domdocument extends domnode * @@ -1030,9 +1021,8 @@ { zval *id, *rv = NULL; xmlDocPtr docp; - idsIterator iter; - xmlHashTable *ids = NULL; - int ret,idname_len; + xmlAttrPtr attrp; + int ret, idname_len; dom_object *intern; char *idname; @@ -1041,16 +1031,14 @@ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &idname, &idname_len) == FAILURE) { return; } + attrp = xmlGetID(docp, (xmlChar *) idname); - ids = (xmlHashTable *) docp->ids; - if (ids) { - iter.elementId = (xmlChar *) idname; - iter.element = NULL; - xmlHashScan(ids, (void *)idsHashScanner, &iter); - DOM_RET_OBJ(rv, (xmlNodePtr) iter.element, &ret, intern); + if (attrp && attrp->parent) { + DOM_RET_OBJ(rv, (xmlNodePtr) attrp->parent, &ret, intern); } else { RETVAL_NULL(); } + } /* }}} end dom_document_get_element_by_id */ @@ -1517,25 +1505,30 @@ zval *id; xmlDoc *docp; dom_object *intern; - xmlValidCtxt cvp; - + xmlValidCtxt *cvp; + DOM_GET_THIS_OBJ(docp, id, xmlDocPtr, intern); - + if (docp->intSubset == NULL) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "No DTD given in XML-Document"); } - - cvp.userData = NULL; - cvp.error = (xmlValidityErrorFunc) php_libxml_error_handler; - cvp.warning = (xmlValidityErrorFunc) php_libxml_error_handler; - - if (xmlValidateDocument(&cvp, docp)) { + + cvp = xmlNewValidCtxt(); + + cvp->userData = NULL; + cvp->error = (xmlValidityErrorFunc) php_libxml_error_handler; + cvp->warning = (xmlValidityErrorFunc) php_libxml_error_handler; + + if (xmlValidateDocument(cvp, docp)) { RETVAL_TRUE; } else { RETVAL_FALSE; } + + xmlFreeValidCtxt(cvp); + } -/* }}} end dom_document_validate */ + #if defined(LIBXML_SCHEMAS_ENABLED) static void
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php