chregu Wed Jul 28 08:42:16 2004 EDT Modified files: (Branch: PHP_5_0) /php-src NEWS /php-src/ext/xsl php_xsl.c php_xsl.h xsltprocessor.c Log: MFH Fixed bug #29409 (Segfault in PHP functions called from XSLT). (Rob)
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1760.2.12&r2=1.1760.2.13&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.1760.2.12 php-src/NEWS:1.1760.2.13 --- php-src/NEWS:1.1760.2.12 Tue Jul 27 21:44:41 2004 +++ php-src/NEWS Wed Jul 28 08:42:16 2004 @@ -1,6 +1,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2004, PHP 5.0.1 +- Fixed bug #29409 (Segfault in PHP functions called from XSLT). (Rob) - Fixed unloading of dynamically loaded extensions. (Marcus, kameshj at fastmail dot fm) - Fixed bug 29395 (sqlite_escape_string() returns bogus data on empty http://cvs.php.net/diff.php/php-src/ext/xsl/php_xsl.c?r1=1.22&r2=1.22.2.1&ty=u Index: php-src/ext/xsl/php_xsl.c diff -u php-src/ext/xsl/php_xsl.c:1.22 php-src/ext/xsl/php_xsl.c:1.22.2.1 --- php-src/ext/xsl/php_xsl.c:1.22 Mon Jul 12 09:04:01 2004 +++ php-src/ext/xsl/php_xsl.c Wed Jul 28 08:42:16 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xsl.c,v 1.22 2004/07/12 13:04:01 chregu Exp $ */ +/* $Id: php_xsl.c,v 1.22.2.1 2004/07/28 12:42:16 chregu Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -132,6 +132,11 @@ zend_hash_destroy(intern->parameter); FREE_HASHTABLE(intern->parameter); + if (intern->node_list) { + zend_hash_destroy(intern->node_list); + FREE_HASHTABLE(intern->node_list); + } + if (intern->ptr) { /* free wrapper */ if (((xsltStylesheetPtr) intern->ptr)->_private != NULL) { @@ -160,6 +165,7 @@ intern->parameter = NULL; intern->hasKeys = 0; intern->registerPhpFunctions = 0; + intern->node_list = NULL; ALLOC_HASHTABLE(intern->std.properties); zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); @@ -285,6 +291,7 @@ */ PHP_RINIT_FUNCTION(xsl) { + xsltSetGenericErrorFunc(NULL, php_libxml_error_handler); return SUCCESS; } /* }}} */ @@ -294,6 +301,7 @@ */ PHP_RSHUTDOWN_FUNCTION(xsl) { + xsltSetGenericErrorFunc(NULL, NULL); return SUCCESS; } /* }}} */ http://cvs.php.net/diff.php/php-src/ext/xsl/php_xsl.h?r1=1.10&r2=1.10.2.1&ty=u Index: php-src/ext/xsl/php_xsl.h diff -u php-src/ext/xsl/php_xsl.h:1.10 php-src/ext/xsl/php_xsl.h:1.10.2.1 --- php-src/ext/xsl/php_xsl.h:1.10 Wed Feb 4 06:14:47 2004 +++ php-src/ext/xsl/php_xsl.h Wed Jul 28 08:42:16 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xsl.h,v 1.10 2004/02/04 11:14:47 zeev Exp $ */ +/* $Id: php_xsl.h,v 1.10.2.1 2004/07/28 12:42:16 chregu Exp $ */ #ifndef PHP_XSL_H #define PHP_XSL_H @@ -57,6 +57,7 @@ HashTable *parameter; int hasKeys; int registerPhpFunctions; + HashTable *node_list; } xsl_object; void php_xsl_set_object(zval *wrapper, void *obj TSRMLS_DC); http://cvs.php.net/diff.php/php-src/ext/xsl/xsltprocessor.c?r1=1.29&r2=1.29.2.1&ty=u Index: php-src/ext/xsl/xsltprocessor.c diff -u php-src/ext/xsl/xsltprocessor.c:1.29 php-src/ext/xsl/xsltprocessor.c:1.29.2.1 --- php-src/ext/xsl/xsltprocessor.c:1.29 Fri May 28 10:17:46 2004 +++ php-src/ext/xsl/xsltprocessor.c Wed Jul 28 08:42:16 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xsltprocessor.c,v 1.29 2004/05/28 14:17:46 iliaa Exp $ */ +/* $Id: xsltprocessor.c,v 1.29.2.1 2004/07/28 12:42:16 chregu Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -144,6 +144,7 @@ xmlXPathObjectPtr obj; char *str; char *callable = NULL; + xsl_object *intern; TSRMLS_FETCH(); @@ -258,6 +259,13 @@ if (retval->type == IS_OBJECT && instanceof_function( Z_OBJCE_P(retval), dom_node_class_entry TSRMLS_CC)) { xmlNode *nodep; dom_object *obj; + intern = (xsl_object *) tctxt->_private; + if (intern->node_list == NULL) { + ALLOC_HASHTABLE(intern->node_list); + zend_hash_init(intern->node_list, 0, NULL, ZVAL_PTR_DTOR, 0); + } + zval_add_ref(&retval); + zend_hash_next_index_insert(intern->node_list, &retval, sizeof(zval *), NULL); obj = (dom_object *)zend_object_store_get_object(retval TSRMLS_CC); nodep = dom_object_get_node(obj); valuePush(ctxt, xmlXPathNewNodeSet(nodep)); @@ -378,6 +386,55 @@ /* }}} end xsl_xsltprocessor_import_stylesheet */ +static xmlDocPtr php_xsl_apply_stylesheet(xsl_object *intern, xsltStylesheetPtr style, xmlDocPtr doc TSRMLS_DC) +{ + xmlDocPtr newdocp; + xsltTransformContextPtr ctxt; + char **params = NULL; + int clone; + + + if (intern->parameter) { + params = php_xsl_xslt_make_params(intern->parameter, 0 TSRMLS_CC); + } + + if (intern->hasKeys == 1) { + doc = xmlCopyDoc(doc, 1); + } + + ctxt = xsltNewTransformContext(style, doc); + ctxt->_private = (void *) intern; + + newdocp = xsltApplyStylesheetUser(style, doc, (const char**) params, NULL, NULL, ctxt); + + xsltFreeTransformContext(ctxt); + + if (intern->node_list != NULL) { + zend_hash_destroy(intern->node_list); + FREE_HASHTABLE(intern->node_list); + intern->node_list = NULL; + } + + if (intern->registerPhpFunctions == 1) { + php_xsl_unregister_php_functions(); + } + + if (intern->hasKeys == 1) { + xmlFreeDoc(doc); + } + + if (params) { + clone = 0; + while(params[clone]) { + efree(params[clone++]); + } + efree(params); + } + + return newdocp; + +} + /* {{{ proto xsl_document xsl_xsltprocessor_transform_to_doc(node doc [,boolean clone]); URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html# Since: @@ -389,8 +446,7 @@ xmlNodePtr node = NULL; xmlDoc *newdocp; xsltStylesheetPtr sheetp; - int ret, clone; - char **params = NULL; + int ret; xsl_object *intern; id = getThis(); @@ -411,30 +467,7 @@ RETURN_NULL(); } - if (intern->parameter) { - params = php_xsl_xslt_make_params(intern->parameter, 0 TSRMLS_CC); - } - - if (intern->hasKeys == 1) { - doc = xmlCopyDoc(doc, 1); - } - newdocp = xsltApplyStylesheet(sheetp, doc, (const char**) params); - - if (intern->registerPhpFunctions == 1) { - php_xsl_unregister_php_functions(); - } - - if (intern->hasKeys == 1) { - xmlFreeDoc(doc); - } - - if (params) { - clone = 0; - while(params[clone]) { - efree(params[clone++]); - } - efree(params); - } + newdocp = php_xsl_apply_stylesheet(intern, sheetp, doc TSRMLS_CC); if (newdocp) { DOM_RET_OBJ(rv, (xmlNodePtr) newdocp, &ret, NULL); @@ -455,8 +488,8 @@ xmlDoc *newdocp; xmlNodePtr node = NULL; xsltStylesheetPtr sheetp; - int ret, uri_len, clone; - char **params = NULL, *uri; + int ret, uri_len; + char *uri; xsl_object *intern; id = getThis(); @@ -477,31 +510,7 @@ RETURN_NULL(); } - if (intern->parameter) { - params = php_xsl_xslt_make_params(intern->parameter, 0 TSRMLS_CC); - } - - if (intern->hasKeys == 1) { - doc = xmlCopyDoc(doc, 1); - } - - newdocp = xsltApplyStylesheet(sheetp, doc, (const char**)params); - - if (intern->registerPhpFunctions == 1) { - php_xsl_unregister_php_functions(); - } - - if (intern->hasKeys == 1) { - xmlFreeDoc(doc); - } - - if (params) { - clone = 0; - while(params[clone]) { - efree(params[clone++]); - } - efree(params); - } + newdocp = php_xsl_apply_stylesheet(intern, sheetp, doc TSRMLS_CC); ret = -1; if (newdocp) { @@ -523,10 +532,9 @@ xmlDoc *newdocp; xmlNodePtr node = NULL; xsltStylesheetPtr sheetp; - int ret, clone; + int ret; xmlChar *doc_txt_ptr; int doc_txt_len; - char **params = NULL; xsl_object *intern; id = getThis(); @@ -547,31 +555,7 @@ RETURN_NULL(); } - if (intern->parameter) { - params = php_xsl_xslt_make_params(intern->parameter, 0 TSRMLS_CC); - } - - if (intern->hasKeys == 1) { - doc = xmlCopyDoc(doc, 1); - } - - newdocp = xsltApplyStylesheet(sheetp, doc, (const char**)params); - - if (intern->registerPhpFunctions == 1) { - php_xsl_unregister_php_functions(); - } - - if (intern->hasKeys == 1) { - xmlFreeDoc(doc); - } - - if (params) { - clone = 0; - while(params[clone]) { - efree(params[clone++]); - } - efree(params); - } + newdocp = php_xsl_apply_stylesheet(intern, sheetp, doc TSRMLS_CC); ret = -1; if (newdocp) {
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php