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