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