From 6a53a49c8b343d63b586ed2ffcd547767f9746c3 Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Wed, 29 Mar 2006 15:08:52 +0000 Subject: [PATCH] MF51: fix bug #36898 (__set() leaks in classes extending internal ones) Added: ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce TSRMLS_DC) ZEND_API void zend_object_std_dtor(zend_object *object TSRMLS_DC) --- Zend/zend_objects.c | 20 ++++++++++++++++++++ Zend/zend_objects.h | 2 ++ ext/com_dotnet/com_persist.c | 12 ++++-------- ext/date/php_date.c | 22 ++++------------------ ext/dom/php_dom.c | 14 ++++---------- ext/mysqli/mysqli.c | 10 ++++------ ext/reflection/php_reflection.c | 9 ++------- ext/simplexml/simplexml.c | 9 +++------ ext/spl/spl_array.c | 7 ++----- ext/spl/spl_directory.c | 10 ++++------ ext/spl/spl_iterators.c | 14 ++++---------- ext/spl/spl_observer.c | 9 +++------ ext/sqlite/sqlite.c | 7 ++----- ext/tidy/tidy.c | 7 ++----- ext/xmlreader/php_xmlreader.c | 7 ++----- ext/xmlwriter/php_xmlwriter.c | 11 +++-------- ext/xsl/php_xsl.c | 8 ++------ 17 files changed, 67 insertions(+), 111 deletions(-) diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 416e9cace3f..cf81e6c519c 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -25,6 +25,26 @@ #include "zend_API.h" #include "zend_interfaces.h" +ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce TSRMLS_DC) +{ + ALLOC_HASHTABLE(object->properties); + zend_hash_init(object->properties, 0, NULL, ZVAL_PTR_DTOR, 0); + + object->ce = ce; + object->guards = NULL; +} + +ZEND_API void zend_object_std_dtor(zend_object *object TSRMLS_DC) +{ + if (object->guards) { + zend_hash_destroy(object->guards); + FREE_HASHTABLE(object->guards); + } + if (object->properties) { + zend_hash_destroy(object->properties); + FREE_HASHTABLE(object->properties); + } +} ZEND_API void zend_objects_destroy_object(zend_object *object, zend_object_handle handle TSRMLS_DC) { diff --git a/Zend/zend_objects.h b/Zend/zend_objects.h index b1d50379f4f..ebeaf896782 100644 --- a/Zend/zend_objects.h +++ b/Zend/zend_objects.h @@ -25,6 +25,8 @@ #include "zend.h" BEGIN_EXTERN_C() +ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce TSRMLS_DC); +ZEND_API void zend_object_std_dtor(zend_object *object TSRMLS_DC); ZEND_API zend_object_value zend_objects_new(zend_object **object, zend_class_entry *class_type TSRMLS_DC); ZEND_API void zend_objects_destroy_object(zend_object *object, zend_object_handle handle TSRMLS_DC); ZEND_API zend_object *zend_objects_get_address(zval *object TSRMLS_DC); diff --git a/ext/com_dotnet/com_persist.c b/ext/com_dotnet/com_persist.c index b8c438df51e..f9e327fbb25 100755 --- a/ext/com_dotnet/com_persist.c +++ b/ext/com_dotnet/com_persist.c @@ -701,8 +701,7 @@ static void helper_free_storage(void *obj TSRMLS_DC) if (object->unk) { IUnknown_Release(object->unk); } - zend_hash_destroy(object->std.properties); - FREE_HASHTABLE(object->std.properties); + zend_object_std_dtor(&object->std TSRMLS_CC); efree(object); } @@ -715,9 +714,8 @@ static void helper_clone(void *obj, void **clone_ptr TSRMLS_DC) memcpy(clone, object, sizeof(*object)); *clone_ptr = clone; - ALLOC_HASHTABLE(clone->std.properties); - zend_hash_init(clone->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); - + zend_object_std_init(&clone->std, object->std.ce TSRMLS_CC); + if (clone->ipf) { IPersistFile_AddRef(clone->ipf); } @@ -740,9 +738,7 @@ static zend_object_value helper_new(zend_class_entry *ce TSRMLS_DC) helper = emalloc(sizeof(*helper)); memset(helper, 0, sizeof(*helper)); - ALLOC_HASHTABLE(helper->std.properties); - zend_hash_init(helper->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); - helper->std.ce = helper_ce; + zend_object_std_init(&helper->std, helper_ce TSRMLS_CC); retval.handle = zend_objects_store_put(helper, NULL, helper_free_storage, helper_clone TSRMLS_CC); retval.handlers = &helper_handlers; diff --git a/ext/date/php_date.c b/ext/date/php_date.c index b1aeb7e96a4..9895f941602 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1359,10 +1359,8 @@ static zend_object_value date_object_new_date(zend_class_entry *class_type TSRML intern = emalloc(sizeof(php_date_obj)); memset(intern, 0, sizeof(php_date_obj)); - intern->std.ce = class_type; - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) date_object_free_storage_date, NULL TSRMLS_CC); @@ -1379,10 +1377,8 @@ static zend_object_value date_object_new_timezone(zend_class_entry *class_type T intern = emalloc(sizeof(php_timezone_obj)); memset(intern, 0, sizeof(php_timezone_obj)); - intern->std.ce = class_type; - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) date_object_free_storage_timezone, NULL TSRMLS_CC); @@ -1402,12 +1398,7 @@ static void date_object_free_storage_date(void *object TSRMLS_DC) timelib_time_dtor(intern->time); } - if (intern->std.properties) { - zend_hash_destroy(intern->std.properties); - efree(intern->std.properties); - intern->std.properties = NULL; - } - + zend_object_std_dtor(&intern->std TSRMLS_CC); efree(object); } @@ -1415,12 +1406,7 @@ static void date_object_free_storage_timezone(void *object TSRMLS_DC) { php_timezone_obj *intern = (php_timezone_obj *)object; - if (intern->std.properties) { - zend_hash_destroy(intern->std.properties); - efree(intern->std.properties); - intern->std.properties = NULL; - } - + zend_object_std_dtor(&intern->std TSRMLS_CC); efree(object); } diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index 0273f80b1b6..f06f7badb8d 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -934,8 +934,7 @@ void dom_xpath_objects_free_storage(void *object TSRMLS_DC) { dom_object *intern = (dom_object *)object; - zend_hash_destroy(intern->std.properties); - FREE_HASHTABLE(intern->std.properties); + zend_object_std_dtor(&intern->std TSRMLS_CC); if (intern->ptr != NULL) { xmlXPathFreeContext((xmlXPathContextPtr) intern->ptr); @@ -954,8 +953,7 @@ void dom_objects_free_storage(void *object TSRMLS_DC) dom_object *intern = (dom_object *)object; int retcount; - zend_hash_destroy(intern->std.properties); - FREE_HASHTABLE(intern->std.properties); + zend_object_std_dtor(&intern->std TSRMLS_CC); if (intern->ptr != NULL && ((php_libxml_node_ptr *)intern->ptr)->node != NULL) { if (((xmlNodePtr) ((php_libxml_node_ptr *)intern->ptr)->node)->type != XML_DOCUMENT_NODE && ((xmlNodePtr) ((php_libxml_node_ptr *)intern->ptr)->node)->type != XML_HTML_DOCUMENT_NODE) { @@ -1001,8 +999,6 @@ static dom_object* dom_objects_set_class(zend_class_entry *class_type, zend_bool dom_object *intern; intern = emalloc(sizeof(dom_object)); - intern->std.ce = class_type; - intern->std.guards = NULL; intern->ptr = NULL; intern->prop_handler = NULL; intern->document = NULL; @@ -1014,8 +1010,7 @@ static dom_object* dom_objects_set_class(zend_class_entry *class_type, zend_bool zend_u_hash_find(UG(unicode)?&u_classes:&classes, UG(unicode)?IS_UNICODE:IS_STRING, base_class->name, base_class->name_length + 1, (void **) &intern->prop_handler); - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); if (hash_copy) { zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); } @@ -1120,8 +1115,7 @@ void dom_nnodemap_objects_free_storage(void *object TSRMLS_DC) php_libxml_decrement_doc_ref((php_libxml_node_object *)intern TSRMLS_CC); - zend_hash_destroy(intern->std.properties); - FREE_HASHTABLE(intern->std.properties); + zend_object_std_dtor(&intern->std TSRMLS_CC); efree(object); } diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 8b1ca3bff67..9e46b387667 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -123,8 +123,9 @@ void php_clear_mysql(MY_MYSQL *mysql) { static void mysqli_objects_free_storage(zend_object *object TSRMLS_DC) { mysqli_object *intern = (mysqli_object *)object; - - zend_objects_free_object_storage(&(intern->zo) TSRMLS_CC); + + zend_object_std_dtor(&intern->zo TSRMLS_CC); + efree(intern); } /* }}} */ @@ -345,8 +346,6 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_ intern = emalloc(sizeof(mysqli_object)); memset(intern, 0, sizeof(mysqli_object)); - intern->zo.ce = class_type; - intern->zo.guards = NULL; intern->ptr = NULL; intern->valid = 0; intern->prop_handler = NULL; @@ -359,8 +358,7 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_ zend_hash_find(&classes, mysqli_base_class->name.s, mysqli_base_class->name_length + 1, (void **) &intern->prop_handler); - ALLOC_HASHTABLE(intern->zo.properties); - zend_hash_init(intern->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 259bebddcb8..5dac6120b73 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -235,9 +235,7 @@ static void reflection_objects_clone(void *object, void **object_clone TSRMLS_DC reflection_object **intern_clone = (reflection_object **) object_clone; *intern_clone = emalloc(sizeof(reflection_object)); - (*intern_clone)->zo.ce = intern->zo.ce; - (*intern_clone)->zo.guards = NULL; - ALLOC_HASHTABLE((*intern_clone)->zo.properties); + zend_object_std_init(&(*intern_clone)->zo, intern->zo.ce TSRMLS_CC); (*intern_clone)->ptr = intern->ptr; (*intern_clone)->free_ptr = intern->free_ptr; (*intern_clone)->obj = intern->obj; @@ -253,14 +251,11 @@ static zend_object_value reflection_objects_new(zend_class_entry *class_type TSR reflection_object *intern; intern = emalloc(sizeof(reflection_object)); - intern->zo.ce = class_type; - intern->zo.guards = NULL; intern->ptr = NULL; intern->obj = NULL; intern->free_ptr = 0; - ALLOC_HASHTABLE(intern->zo.properties); - zend_u_hash_init(intern->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0, UG(unicode)); + zend_object_std_init(&intern->zo, class_type TSRMLS_CC); zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); retval.handle = zend_objects_store_put(intern, NULL, reflection_free_objects_storage, reflection_objects_clone TSRMLS_CC); retval.handlers = &reflection_object_handlers; diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 70182def08c..d6e75004eb4 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -1752,9 +1752,8 @@ static void sxe_object_free_storage(void *object TSRMLS_DC) sxe = (php_sxe_object *) object; - zend_hash_destroy(sxe->zo.properties); - FREE_HASHTABLE(sxe->zo.properties); - + zend_object_std_dtor(&sxe->zo TSRMLS_CC); + php_libxml_node_decrement_resource((php_libxml_node_object *)sxe TSRMLS_CC); if (sxe->xpath) { @@ -1777,14 +1776,12 @@ static php_sxe_object* php_sxe_object_new(zend_class_entry *ce TSRMLS_DC) php_sxe_object *intern; intern = ecalloc(1, sizeof(php_sxe_object)); - intern->zo.ce = ce; intern->iter.type = SXE_ITER_NONE; intern->iter.nsprefix = NULL; intern->iter.name = NULL; - ALLOC_HASHTABLE(intern->zo.properties); - zend_hash_init(intern->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->zo, ce TSRMLS_CC); return intern; } diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 6f0d38b742f..4c28b66decd 100755 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -109,8 +109,7 @@ static void spl_array_object_free_storage(void *object TSRMLS_DC) { spl_array_object *intern = (spl_array_object *)object; - zend_hash_destroy(intern->std.properties); - FREE_HASHTABLE(intern->std.properties); + zend_object_std_dtor(&intern->std TSRMLS_CC); zval_ptr_dtor(&intern->array); zval_ptr_dtor(&intern->retval); @@ -132,12 +131,10 @@ static zend_object_value spl_array_object_new_ex(zend_class_entry *class_type, s intern = emalloc(sizeof(spl_array_object)); memset(intern, 0, sizeof(spl_array_object)); - intern->std.ce = class_type; *obj = intern; ALLOC_INIT_ZVAL(intern->retval); - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); intern->ar_flags = 0; diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 3cd1e73538f..e8cfb54b711 100755 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -73,9 +73,9 @@ static void spl_filesystem_object_free_storage(void *object TSRMLS_DC) /* {{{ */ if (intern->oth_handler && intern->oth_handler->dtor) { intern->oth_handler->dtor(intern TSRMLS_CC); } - zend_hash_destroy(intern->std.properties); - FREE_HASHTABLE(intern->std.properties); - + + zend_object_std_dtor(&intern->std TSRMLS_CC); + if (intern->path) { efree(intern->path); } @@ -132,14 +132,12 @@ static zend_object_value spl_filesystem_object_new_ex(zend_class_entry *class_ty intern = emalloc(sizeof(spl_filesystem_object)); memset(intern, 0, sizeof(spl_filesystem_object)); - intern->std.ce = class_type; /* intern->type = SPL_FS_INFO; done by set 0 */ intern->file_class = spl_ce_SplFileObject; intern->info_class = spl_ce_SplFileInfo; if (obj) *obj = intern; - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) spl_filesystem_object_free_storage, NULL TSRMLS_CC); diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index c6c4d0ce69b..63d290c5890 100755 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -687,8 +687,7 @@ static void spl_RecursiveIteratorIterator_free_storage(void *_object TSRMLS_DC) object->iterators = NULL; } - zend_hash_destroy(object->std.properties); - FREE_HASHTABLE(object->std.properties); + zend_object_std_dtor(&object->std TSRMLS_CC); efree(object); } @@ -703,10 +702,8 @@ static zend_object_value spl_RecursiveIteratorIterator_new(zend_class_entry *cla intern = emalloc(sizeof(spl_recursive_it_object)); memset(intern, 0, sizeof(spl_recursive_it_object)); - intern->std.ce = class_type; - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) spl_RecursiveIteratorIterator_free_storage, NULL TSRMLS_CC); @@ -1385,8 +1382,7 @@ static inline void spl_dual_it_free_storage(void *_object TSRMLS_DC) } #endif - zend_hash_destroy(object->std.properties); - FREE_HASHTABLE(object->std.properties); + zend_object_std_dtor(&object->std TSRMLS_CC); efree(object); } @@ -1401,11 +1397,9 @@ static zend_object_value spl_dual_it_new(zend_class_entry *class_type TSRMLS_DC) intern = emalloc(sizeof(spl_dual_it_object)); memset(intern, 0, sizeof(spl_dual_it_object)); - intern->std.ce = class_type; intern->dit_type = DIT_Unknown; - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) spl_dual_it_free_storage, NULL TSRMLS_CC); diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index d20912c5e5d..05bc75c978b 100755 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -85,9 +85,8 @@ void spl_SplOjectStorage_free_storage(void *object TSRMLS_DC) /* {{{ */ { spl_SplObjectStorage *intern = (spl_SplObjectStorage *)object; - zend_hash_destroy(intern->std.properties); - FREE_HASHTABLE(intern->std.properties); - + zend_object_std_dtor(&intern->std TSRMLS_CC); + zend_hash_destroy(&intern->storage); efree(object); @@ -101,11 +100,9 @@ static zend_object_value spl_object_storage_new_ex(zend_class_entry *class_type, intern = emalloc(sizeof(spl_SplObjectStorage)); memset(intern, 0, sizeof(spl_SplObjectStorage)); - intern->std.ce = class_type; *obj = intern; - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); zend_hash_init(&intern->storage, 0, NULL, ZVAL_PTR_DTOR, 0); diff --git a/ext/sqlite/sqlite.c b/ext/sqlite/sqlite.c index b1df8487db0..720bc08fd1d 100644 --- a/ext/sqlite/sqlite.c +++ b/ext/sqlite/sqlite.c @@ -796,8 +796,7 @@ static void sqlite_object_free_storage(void *object TSRMLS_DC) { sqlite_object *intern = (sqlite_object *)object; - zend_hash_destroy(intern->std.properties); - FREE_HASHTABLE(intern->std.properties); + zend_object_std_dtor(&intern->std TSRMLS_CC); if (intern->u.ptr) { if (intern->type == is_db) { @@ -820,10 +819,8 @@ static void sqlite_object_new(zend_class_entry *class_type, zend_object_handlers intern = emalloc(sizeof(sqlite_object)); memset(intern, 0, sizeof(sqlite_object)); - intern->std.ce = class_type; - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); retval->handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) sqlite_object_free_storage, NULL TSRMLS_CC); diff --git a/ext/tidy/tidy.c b/ext/tidy/tidy.c index f72319cb399..5717dfb6f42 100644 --- a/ext/tidy/tidy.c +++ b/ext/tidy/tidy.c @@ -530,8 +530,7 @@ static void tidy_object_free_storage(void *object TSRMLS_DC) { PHPTidyObj *intern = (PHPTidyObj *)object; - zend_hash_destroy(intern->std.properties); - FREE_HASHTABLE(intern->std.properties); + zend_object_std_dtor(&intern->std TSRMLS_CC); if (intern->ptdoc) { intern->ptdoc->ref_count--; @@ -555,10 +554,8 @@ static void tidy_object_new(zend_class_entry *class_type, zend_object_handlers * intern = emalloc(sizeof(PHPTidyObj)); memset(intern, 0, sizeof(PHPTidyObj)); - intern->std.ce = class_type; - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); switch(objtype) { diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 20de2c9d9fe..2edfcc8f4c2 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -378,8 +378,7 @@ void xmlreader_objects_free_storage(void *object TSRMLS_DC) { xmlreader_object *intern = (xmlreader_object *)object; - zend_hash_destroy(intern->std.properties); - FREE_HASHTABLE(intern->std.properties); + zend_object_std_dtor(&intern->std TSRMLS_CC); xmlreader_free_resources(intern); @@ -396,13 +395,11 @@ zend_object_value xmlreader_objects_new(zend_class_entry *class_type TSRMLS_DC) intern = emalloc(sizeof(xmlreader_object)); memset(&intern->std, 0, sizeof(zend_object)); - intern->std.ce = class_type; intern->ptr = NULL; intern->schema = NULL; intern->prop_handler = &xmlreader_prop_handlers; - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) xmlreader_objects_free_storage, xmlreader_objects_clone TSRMLS_CC); intern->handle = retval.handle; diff --git a/ext/xmlwriter/php_xmlwriter.c b/ext/xmlwriter/php_xmlwriter.c index 386c2034c7e..7404f35eba0 100644 --- a/ext/xmlwriter/php_xmlwriter.c +++ b/ext/xmlwriter/php_xmlwriter.c @@ -80,11 +80,8 @@ static void xmlwriter_object_free_storage(void *object TSRMLS_DC) xmlwriter_free_resource_ptr(intern->xmlwriter_ptr TSRMLS_CC); } intern->xmlwriter_ptr = NULL; - if (intern->zo.properties) { - zend_hash_destroy(intern->zo.properties); - FREE_HASHTABLE(intern->zo.properties); - } - + zend_object_std_dtor(&intern->zo TSRMLS_CC); + efree(intern); } /* }}} */ @@ -99,11 +96,9 @@ PHP_XMLWRITER_API zend_object_value xmlwriter_object_new(zend_class_entry *class intern = emalloc(sizeof(ze_xmlwriter_object)); memset(&intern->zo, 0, sizeof(zend_object)); - intern->zo.ce = class_type; intern->xmlwriter_ptr = NULL; - ALLOC_HASHTABLE(intern->zo.properties); - zend_hash_init(intern->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->zo, class_type TSRMLS_CC); zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); diff --git a/ext/xsl/php_xsl.c b/ext/xsl/php_xsl.c index c57f952a310..c8b396aca05 100644 --- a/ext/xsl/php_xsl.c +++ b/ext/xsl/php_xsl.c @@ -80,8 +80,7 @@ void xsl_objects_free_storage(void *object TSRMLS_DC) { xsl_object *intern = (xsl_object *)object; - zend_hash_destroy(intern->std.properties); - FREE_HASHTABLE(intern->std.properties); + zend_object_std_dtor(&intern->std TSRMLS_CC); zend_hash_destroy(intern->parameter); FREE_HASHTABLE(intern->parameter); @@ -119,8 +118,6 @@ zend_object_value xsl_objects_new(zend_class_entry *class_type TSRMLS_DC) zval *tmp; intern = emalloc(sizeof(xsl_object)); - intern->std.ce = class_type; - intern->std.guards = NULL; intern->ptr = NULL; intern->prop_handler = NULL; intern->parameter = NULL; @@ -130,8 +127,7 @@ zend_object_value xsl_objects_new(zend_class_entry *class_type TSRMLS_DC) intern->node_list = NULL; intern->doc = NULL; - ALLOC_HASHTABLE(intern->std.properties); - zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_object_std_init(&intern->std, class_type TSRMLS_CC); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); ALLOC_HASHTABLE(intern->parameter); zend_hash_init(intern->parameter, 0, NULL, ZVAL_PTR_DTOR, 0);