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