rrichards Sat Jun 7 09:30:58 2003 EDT
Modified files:
/php4/ext/dom xml_common.h php_dom.c
Log:
fix more memory overruns
initial definition for document ref counting
fixed property access to support all objects
clear property handler from invalid objects until ref count implemented
Index: php4/ext/dom/xml_common.h
diff -u php4/ext/dom/xml_common.h:1.2 php4/ext/dom/xml_common.h:1.3
--- php4/ext/dom/xml_common.h:1.2 Fri Jun 6 02:40:36 2003
+++ php4/ext/dom/xml_common.h Sat Jun 7 09:30:58 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: xml_common.h,v 1.2 2003/06/06 06:40:36 sniper Exp $ */
+/* $Id: xml_common.h,v 1.3 2003/06/07 13:30:58 rrichards Exp $ */
#ifndef PHP_XML_COMMON_H
#define PHP_XML_COMMON_H
@@ -27,9 +27,15 @@
void *next;
} node_list_pointer;
+typedef struct _dom_ref_obj {
+ void *ptr;
+ int refcount;
+} dom_ref_obj;
+
typedef struct _dom_object {
zend_object std;
void *ptr;
+ dom_ref_obj *document;
HashTable *prop_handler;
node_list_pointer *node_list;
} dom_object;
@@ -71,7 +77,6 @@
INIT_CLASS_ENTRY(ce, name, funcs); \
ce.create_object = dom_objects_new; \
entry = zend_register_internal_class_ex(&ce, parent_ce, NULL TSRMLS_CC);
-/* entry = zend_register_internal_ns_class(&ce, parent_ce, ns, NULL TSRMLS_CC); */
#define DOM_GET_OBJ(__ptr, __id, __prtype) { \
dom_object *intern = (dom_object *)zend_object_store_get_object(__id
TSRMLS_CC); \
Index: php4/ext/dom/php_dom.c
diff -u php4/ext/dom/php_dom.c:1.4 php4/ext/dom/php_dom.c:1.5
--- php4/ext/dom/php_dom.c:1.4 Fri Jun 6 15:04:32 2003
+++ php4/ext/dom/php_dom.c Sat Jun 7 09:30:58 2003
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_dom.c,v 1.4 2003/06/06 19:04:32 rrichards Exp $ */
+/* $Id: php_dom.c,v 1.5 2003/06/07 13:30:58 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -97,6 +97,9 @@
object = (dom_object *)zend_objects_get_address(wrapper TSRMLS_CC);
object->ptr = NULL;
+ if (object->prop_handler) {
+ object->prop_handler = NULL;
+ }
}
/* }}} */
@@ -235,27 +238,24 @@
ret = FAILURE;
obj = (dom_object *)zend_objects_get_address(object TSRMLS_CC);
- if (obj->ptr != NULL) {
- if (obj->prop_handler != NULL) {
- ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member),
Z_STRLEN_P(member)+1, (void **) &hnd);
- }
+
+ if (obj->prop_handler != NULL) {
+ ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member),
Z_STRLEN_P(member)+1, (void **) &hnd);
+ }
+ if (ret == SUCCESS) {
+ ret = hnd->read_func(obj, &retval TSRMLS_CC);
if (ret == SUCCESS) {
- ret = hnd->read_func(obj, &retval TSRMLS_CC);
- if (ret == SUCCESS) {
- /* ensure we're creating a temporary variable */
- retval->refcount = 1;
- PZVAL_UNLOCK(retval);
- } else {
- retval = EG(uninitialized_zval_ptr);
- }
+ /* ensure we're creating a temporary variable */
+ retval->refcount = 1;
+ PZVAL_UNLOCK(retval);
} else {
- std_hnd = zend_get_std_object_handlers();
- retval = std_hnd->read_property(object, member TSRMLS_CC);
+ retval = EG(uninitialized_zval_ptr);
}
} else {
- retval = EG(uninitialized_zval_ptr);
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Underlying object
missing");
+ std_hnd = zend_get_std_object_handlers();
+ retval = std_hnd->read_property(object, member TSRMLS_CC);
}
+
if (member == &tmp_member) {
zval_dtor(member);
}
@@ -281,19 +281,17 @@
ret = FAILURE;
obj = (dom_object *)zend_objects_get_address(object TSRMLS_CC);
- if (obj->ptr != NULL) {
- if (obj->prop_handler != NULL) {
- ret = zend_hash_find((HashTable *)obj->prop_handler,
Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
- }
- if (ret == SUCCESS) {
- hnd->write_func(obj, value TSRMLS_CC);
- } else {
- std_hnd = zend_get_std_object_handlers();
- std_hnd->write_property(object, member, value TSRMLS_CC);
- }
+
+ if (obj->prop_handler != NULL) {
+ ret = zend_hash_find((HashTable *)obj->prop_handler,
Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
+ }
+ if (ret == SUCCESS) {
+ hnd->write_func(obj, value TSRMLS_CC);
} else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Underlying object
missing");
+ std_hnd = zend_get_std_object_handlers();
+ std_hnd->write_property(object, member, value TSRMLS_CC);
}
+
if (member == &tmp_member) {
zval_dtor(member);
}
@@ -670,6 +668,24 @@
}
/* }}} end node_list_unlink */
+
+/* {{{ void dom_node_free(xmlNodePtr node) */
+void dom_node_free(xmlNodePtr node)
+{
+ if(node) {
+ switch (node->type) {
+ case XML_ATTRIBUTE_NODE:
+ xmlFreeProp((xmlAttrPtr) node);
+ break;
+ case XML_ENTITY_DECL:
+ break;
+ default:
+ xmlFreeNode(node);
+ }
+ }
+}
+/* }}} end dom_node_free */
+
/* {{{ node_free_list */
void node_free_list(xmlNodePtr node TSRMLS_DC)
{
@@ -679,23 +695,27 @@
curnode = node;
while (curnode != NULL) {
node = curnode;
- node_free_list(node->children TSRMLS_CC);
switch (node->type) {
/* Skip property freeing for the following types */
+ case XML_ENTITY_REF_NODE:
+ node_free_list((xmlNodePtr) node->properties
TSRMLS_CC);
+ break;
case XML_ATTRIBUTE_DECL:
case XML_DTD_NODE:
case XML_DOCUMENT_TYPE_NODE:
case XML_ENTITY_DECL:
case XML_ATTRIBUTE_NODE:
+ node_free_list(node->children TSRMLS_CC);
break;
default:
+ node_free_list(node->children TSRMLS_CC);
node_free_list((xmlNodePtr) node->properties
TSRMLS_CC);
}
dom_unregister_node(node TSRMLS_CC);
curnode = node->next;
xmlUnlinkNode(node);
- xmlFreeNode(node);
+ dom_node_free(node);
}
}
}
@@ -810,6 +830,7 @@
intern->ptr = NULL;
intern->node_list = NULL;
intern->prop_handler = NULL;
+ intern->document = NULL;
base_class = class_type;
while(base_class->type != ZEND_INTERNAL_CLASS && base_class->parent != NULL) {
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php