rrichards Mon Mar 1 07:09:24 2004 EDT Modified files: /php-src/ext/dom php_dom.c /php-src/ext/libxml libxml.c php_libxml.h /php-src/ext/simplexml simplexml.c /php-src/ext/xsl xsltprocessor.c Log: Fix bug #27436 dom_import_simplexml innaccurate extensions register callbacks to export nodes prevents segfault passing invalid objects to import functions
http://cvs.php.net/diff.php/php-src/ext/dom/php_dom.c?r1=1.54&r2=1.55&ty=u Index: php-src/ext/dom/php_dom.c diff -u php-src/ext/dom/php_dom.c:1.54 php-src/ext/dom/php_dom.c:1.55 --- php-src/ext/dom/php_dom.c:1.54 Tue Feb 17 14:57:48 2004 +++ php-src/ext/dom/php_dom.c Mon Mar 1 07:09:21 2004 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dom.c,v 1.54 2004/02/17 19:57:48 rrichards Exp $ */ +/* $Id: php_dom.c,v 1.55 2004/03/01 12:09:21 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -277,6 +277,20 @@ } /* }}} */ + +void *php_dom_export_node(zval *object TSRMLS_DC) +{ + php_libxml_node_object *intern; + xmlNodePtr nodep = NULL; + + intern = (php_libxml_node_object *)zend_object_store_get_object(object TSRMLS_CC); + if (intern && intern->node) { + nodep = intern->node->node; + } + + return nodep; +} + /* {{{ proto somNode dom_import_simplexml(sxeobject node) Get a simplexml_element object from dom to allow for processing */ PHP_FUNCTION(dom_import_simplexml) @@ -284,7 +298,7 @@ #ifdef HAVE_SIMPLEXML zval *rv = NULL; zval *node; - xmlNodePtr nodep; + xmlNodePtr nodep = NULL; php_libxml_node_object *nodeobj; int ret; @@ -292,9 +306,10 @@ return; } - NODE_GET_OBJ(nodep, node, xmlNodePtr, nodeobj); + nodeobj = (php_libxml_node_object *)zend_object_store_get_object(node TSRMLS_CC); + nodep = php_libxml_import_node(node TSRMLS_CC); - if (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE) { + if (nodep && nodeobj && (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE)) { DOM_RET_OBJ(rv, (xmlNodePtr) nodep, &ret, (dom_object *)nodeobj); } else { php_error(E_WARNING, "Invalid Nodetype to import"); @@ -627,6 +642,8 @@ REGISTER_LONG_CONSTANT("DOM_INVALID_ACCESS_ERR", INVALID_ACCESS_ERR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DOM_VALIDATION_ERR", VALIDATION_ERR, CONST_CS | CONST_PERSISTENT); + php_libxml_register_export(dom_node_class_entry, php_dom_export_node); + return SUCCESS; } /* }}} */ http://cvs.php.net/diff.php/php-src/ext/libxml/libxml.c?r1=1.15&r2=1.16&ty=u Index: php-src/ext/libxml/libxml.c diff -u php-src/ext/libxml/libxml.c:1.15 php-src/ext/libxml/libxml.c:1.16 --- php-src/ext/libxml/libxml.c:1.15 Sun Feb 15 07:58:17 2004 +++ php-src/ext/libxml/libxml.c Mon Mar 1 07:09:22 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: libxml.c,v 1.15 2004/02/15 12:58:17 zeev Exp $ */ +/* $Id: libxml.c,v 1.16 2004/03/01 12:09:22 rrichards Exp $ */ #define IS_EXT_MODULE @@ -50,6 +50,12 @@ /* a true global for initialization */ int _php_libxml_initialized = 0; +typedef struct _php_libxml_func_handler { + php_libxml_export_node export_func; +} php_libxml_func_handler; + +static HashTable php_libxml_exports; + #ifdef ZTS int libxml_globals_id; #else @@ -397,6 +403,8 @@ /* report errors via handler rather than stderr */ xmlSetGenericErrorFunc(NULL, php_libxml_error_handler); + zend_hash_init(&php_libxml_exports, 0, NULL, NULL, 1); + _php_libxml_initialized = 1; } } @@ -406,6 +414,7 @@ /* reset libxml generic error handling */ xmlSetGenericErrorFunc(NULL, NULL); xmlCleanupParser(); + zend_hash_destroy(&php_libxml_exports); _php_libxml_initialized = 0; } } @@ -434,6 +443,7 @@ PHP_MSHUTDOWN_FUNCTION(libxml) { php_libxml_shutdown(); + return SUCCESS; } @@ -474,7 +484,39 @@ } /* }}} */ + /* {{{ Common functions shared by extensions */ +int php_libxml_register_export(zend_class_entry *ce, php_libxml_export_node export_function) +{ + php_libxml_func_handler export_hnd; + + /* Initialize in case this module hasnt been loaded yet */ + php_libxml_initialize(); + export_hnd.export_func = export_function; + + return zend_hash_add(&php_libxml_exports, ce->name, ce->name_length + 1, &export_hnd, sizeof(export_hnd), NULL); +} + +PHP_LIBXML_API xmlNodePtr php_libxml_import_node(zval *object TSRMLS_DC) +{ + zend_class_entry *ce = NULL; + xmlNodePtr node = NULL; + php_libxml_func_handler *export_hnd; + + if (object->type == IS_OBJECT) { + ce = Z_OBJCE_P(object); + while (ce->parent != NULL) { + ce = ce->parent; + } + if (zend_hash_find(&php_libxml_exports, ce->name, ce->name_length + 1, (void **) &export_hnd) == SUCCESS) { + node = export_hnd->export_func(object TSRMLS_CC); + } + } + + return node; + +} + int php_libxml_increment_node_ptr(php_libxml_node_object *object, xmlNodePtr node, void *private_data TSRMLS_DC) { int ret_refcount = -1; http://cvs.php.net/diff.php/php-src/ext/libxml/php_libxml.h?r1=1.7&r2=1.8&ty=u Index: php-src/ext/libxml/php_libxml.h diff -u php-src/ext/libxml/php_libxml.h:1.7 php-src/ext/libxml/php_libxml.h:1.8 --- php-src/ext/libxml/php_libxml.h:1.7 Sat Jan 10 08:23:58 2004 +++ php-src/ext/libxml/php_libxml.h Mon Mar 1 07:09:22 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_libxml.h,v 1.7 2004/01/10 13:23:58 helly Exp $ */ +/* $Id: php_libxml.h,v 1.8 2004/03/01 12:09:22 rrichards Exp $ */ #ifndef PHP_LIBXML_H #define PHP_LIBXML_H @@ -64,11 +64,15 @@ HashTable *properties; } php_libxml_node_object; +typedef void * (*php_libxml_export_node) (zval *object TSRMLS_DC); + PHP_FUNCTION(libxml_set_streams_context); int php_libxml_increment_node_ptr(php_libxml_node_object *object, xmlNodePtr node, void *private_data TSRMLS_DC); int php_libxml_decrement_node_ptr(php_libxml_node_object *object TSRMLS_DC); int php_libxml_increment_doc_ref(php_libxml_node_object *object, xmlDocPtr docp TSRMLS_DC); int php_libxml_decrement_doc_ref(php_libxml_node_object *object TSRMLS_DC); +PHP_LIBXML_API xmlNodePtr php_libxml_import_node(zval *object TSRMLS_DC); +PHP_LIBXML_API int php_libxml_register_export(zend_class_entry *ce, php_libxml_export_node export_function); /* When an explicit freeing of node and children is required */ void php_libxml_node_free_resource(xmlNodePtr node TSRMLS_DC); /* When object dtor is called as node may still be referenced */ http://cvs.php.net/diff.php/php-src/ext/simplexml/simplexml.c?r1=1.131&r2=1.132&ty=u Index: php-src/ext/simplexml/simplexml.c diff -u php-src/ext/simplexml/simplexml.c:1.131 php-src/ext/simplexml/simplexml.c:1.132 --- php-src/ext/simplexml/simplexml.c:1.131 Fri Feb 13 10:05:18 2004 +++ php-src/ext/simplexml/simplexml.c Mon Mar 1 07:09:23 2004 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: simplexml.c,v 1.131 2004/02/13 15:05:18 rrichards Exp $ */ +/* $Id: simplexml.c,v 1.132 2004/03/01 12:09:23 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1490,6 +1490,16 @@ } +void *simplexml_export_node(zval *object TSRMLS_DC) +{ + php_sxe_object *sxe; + xmlNodePtr node; + + sxe = php_sxe_fetch_object(object TSRMLS_CC); + GET_NODE(sxe, node); + return php_sxe_get_first_node(sxe, node TSRMLS_CC); +} + #ifdef HAVE_DOM /* {{{ proto simplemxml_element simplexml_import_dom(domNode node [, string class_name]) Get a simplexml_element object from dom to allow for processing */ @@ -1509,8 +1519,9 @@ object = (php_libxml_node_object *)zend_object_store_get_object(node TSRMLS_CC); - if (object->node && object->node->node) { - nodep = object->node->node; + nodep = php_libxml_import_node(node TSRMLS_CC); + + if (nodep) { if (nodep->doc == NULL) { php_error(E_WARNING, "Imported Node must have associated Document"); RETURN_NULL(); @@ -1603,6 +1614,8 @@ } #endif /* HAVE_SPL */ + php_libxml_register_export(sxe_class_entry, simplexml_export_node); + return SUCCESS; } /* }}} */ @@ -1621,7 +1634,7 @@ { php_info_print_table_start(); php_info_print_table_header(2, "Simplexml support", "enabled"); - php_info_print_table_row(2, "Revision", "$Revision: 1.131 $"); + php_info_print_table_row(2, "Revision", "$Revision: 1.132 $"); php_info_print_table_row(2, "Schema support", #ifdef LIBXML_SCHEMAS_ENABLED "enabled"); http://cvs.php.net/diff.php/php-src/ext/xsl/xsltprocessor.c?r1=1.23&r2=1.24&ty=u Index: php-src/ext/xsl/xsltprocessor.c diff -u php-src/ext/xsl/xsltprocessor.c:1.23 php-src/ext/xsl/xsltprocessor.c:1.24 --- php-src/ext/xsl/xsltprocessor.c:1.23 Wed Jan 28 19:33:20 2004 +++ php-src/ext/xsl/xsltprocessor.c Mon Mar 1 07:09:24 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xsltprocessor.c,v 1.23 2004/01/29 00:33:20 rrichards Exp $ */ +/* $Id: xsltprocessor.c,v 1.24 2004/03/01 12:09:24 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -296,19 +296,24 @@ xmlDoc *doc = NULL, *newdoc = NULL; xsltStylesheetPtr sheetp, oldsheetp; xsl_object *intern; - php_libxml_node_object *docobj; int prevSubstValue, prevExtDtdValue, clone_docu = 0; - xmlNode *nodep; + xmlNode *nodep = NULL; zend_object_handlers *std_hnd; zval *cloneDocu, *member; - - DOM_GET_THIS(id); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &docp) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oo", &id, xsl_xsltprocessor_class_entry, &docp) == FAILURE) { RETURN_FALSE; } - DOC_GET_OBJ(doc, docp, xmlDocPtr, docobj); + nodep = php_libxml_import_node(docp TSRMLS_CC); + + if (nodep) { + doc = nodep->doc; + } + if (doc == NULL) { + php_error(E_WARNING, "Invalid Document"); + RETURN_NULL(); + } /* libxslt uses _private, so we must copy the imported stylesheet document otherwise the node proxies will be a mess */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php