]> granicus.if.org Git - php/commitdiff
fix bug #36898 (__set() leaks in classes extending internal ones)
authorAntony Dovgal <tony2001@php.net>
Wed, 29 Mar 2006 14:28:43 +0000 (14:28 +0000)
committerAntony Dovgal <tony2001@php.net>
Wed, 29 Mar 2006 14:28:43 +0000 (14:28 +0000)
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)

to initialize and destroy zend_object structs

18 files changed:
NEWS
Zend/zend_objects.c
Zend/zend_objects.h
ext/com_dotnet/com_persist.c
ext/date/php_date.c
ext/dom/php_dom.c
ext/mysqli/mysqli.c
ext/reflection/php_reflection.c
ext/simplexml/simplexml.c
ext/spl/spl_array.c
ext/spl/spl_directory.c
ext/spl/spl_iterators.c
ext/spl/spl_observer.c
ext/sqlite/sqlite.c
ext/tidy/tidy.c
ext/xmlreader/php_xmlreader.c
ext/xmlwriter/php_xmlwriter.c
ext/xsl/php_xsl.c

diff --git a/NEWS b/NEWS
index cf4235dc3c3f64b92d757c9abbadac31a158d9d6..455314d65f74ba67a004011ffce706e72283dab0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,8 @@ PHP                                                                        NEWS
 - Removed the E_STRICT deprecation notice from "var". (Ilia)
 - Fixed debug_zval_dump() to support private and protected members. (Dmitry)
 - Fixed SoapFault::getMessage(). (Dmitry)
+- Fixed bug #36898 (__set() leaks in classes extending internal ones). 
+  (Tony, Dmitry)
 - Fixed bug #36886 (User filters can leak buckets in some situations). (Ilia)
 - Fixed bug #36878 (error messages are printed even though an exception has 
   been thrown). (Tony)
index 9611bddc4cb260ac0047a6a7c12dce0f37d458ba..6e2c472713c69d4bcfb268d2fbb2f8ca9da3e1f7 100644 (file)
 #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)
 {
@@ -88,12 +108,7 @@ ZEND_API void zend_objects_destroy_object(zend_object *object, zend_object_handl
 
 ZEND_API void zend_objects_free_object_storage(zend_object *object TSRMLS_DC)
 {
-       if (object->guards) {
-               zend_hash_destroy(object->guards);
-               FREE_HASHTABLE(object->guards);         
-       }
-       zend_hash_destroy(object->properties);
-       FREE_HASHTABLE(object->properties);
+       zend_object_std_dtor(object TSRMLS_CC);
        efree(object);
 }
 
index 082e8d1a5f23945d27990b987d04160f6fa34452..a90ed2123d9712418fb2b16b7b008f2e2cc3a769 100644 (file)
@@ -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);
index c1c71fcf4e465d91a0dedb09683421bc1c134edb..8408d619d92348f6c84807b2ccec68a3bb9d75f3 100755 (executable)
@@ -708,8 +708,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);
 }
 
@@ -722,9 +721,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);
        }
@@ -747,9 +745,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;
index 5c5dd59218980c461418dab7e6d17747a31955dd..6898b28ecc6023b9d0f8cb6f18510a73ceb16c72 100644 (file)
@@ -1230,10 +1230,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);
@@ -1250,10 +1248,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);
@@ -1273,12 +1269,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);
 }
 
@@ -1286,12 +1277,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);
 }
 
index 0e5bf0bfa464b86ee39e7913ef3bd6f7a90bddb3..cfbb1b15c8ef19d4c2fb3709134f9ea761362afe 100644 (file)
@@ -906,8 +906,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);
@@ -926,8 +925,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) {
@@ -973,8 +971,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;
@@ -986,8 +982,7 @@ static dom_object* dom_objects_set_class(zend_class_entry *class_type, zend_bool
 
        zend_hash_find(&classes, 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 *));
        }
@@ -1092,8 +1087,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);
 }
index 3e369922c855d4f1f83ddafa2cd85a7712e3f7cb..4a17ad5387cd36d965262996ad4475cb040032b1 100644 (file)
@@ -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);
 }
 /* }}} */
 
@@ -332,8 +333,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->prop_handler = NULL;
 
@@ -345,8 +344,7 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_
        zend_hash_find(&classes, mysqli_base_class->name, 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 *));
 
index 47aefa5d372c97ed48c21d189d507ee4a5dfe787..63e1f83f5861ace0c9d15ef21077a2ee13aa265e 100644 (file)
@@ -240,9 +240,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;
@@ -264,8 +262,7 @@ static zend_object_value reflection_objects_new(zend_class_entry *class_type TSR
        intern->obj = NULL;
        intern->free_ptr = 0;
 
-       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 *));
        retval.handle = zend_objects_store_put(intern, NULL, reflection_free_objects_storage, reflection_objects_clone TSRMLS_CC);
        retval.handlers = &reflection_object_handlers;
index 30f42ae5b7095ed0bdd6833cf1cfeeab6d39b937..42a365a05c6afafc00656556f25d79b7531b9ce3 100644 (file)
@@ -1785,9 +1785,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) {
@@ -1810,14 +1809,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;
 }
index 8e4045f6c43642a7726566b7b44cb1c14abafa7e..4b174192467d59c916026faea33063197b76a5cf 100755 (executable)
@@ -103,8 +103,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);
@@ -124,12 +123,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;
index 56d39169b2cbeb6697bf6a9a8868900491ac5d8a..4fb7533b2abdc3904f91d4fb764b6aa5861e780a 100755 (executable)
@@ -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);
index 45c30e551fe6771116df444bfddde8b63128a37d..03f2accb50890476258e0b6fd01173d6338fa5ef 100755 (executable)
@@ -670,8 +670,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);
 }
@@ -686,10 +685,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);
@@ -1271,8 +1268,7 @@ static inline void spl_dual_it_free_storage(void *_object TSRMLS_DC)
                zval_ptr_dtor(&object->u.append.zarrayit);
        }
 
-       zend_hash_destroy(object->std.properties);
-       FREE_HASHTABLE(object->std.properties);
+       zend_object_std_dtor(&object->std TSRMLS_CC);
 
        efree(object);
 }
@@ -1287,11 +1283,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);
index d20912c5e5d20b6a786f87c942a62a14b8f64ade..05bc75c978bbc24929406a3a0856b69e0c38b634 100755 (executable)
@@ -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);
index 13633b8f8cc80aa2051acda0920636f547113aad..fb97233695166206f474545ce612958634030e63 100644 (file)
@@ -802,8 +802,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) {
@@ -826,10 +825,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);
index 3cc8b37636ef926b02b1d8f800009b2b6328ebd3..81e8e0b06954d5c704fa0753fbe00838a75a3afd 100644 (file)
@@ -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) {
index a662d6086b9d00af997b707d34389441fa1c60bc..a8227448a3afad227f7c97d0c2d7cb2dcf77ab0d 100644 (file)
@@ -377,8 +377,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);
 
@@ -394,15 +393,12 @@ zend_object_value xmlreader_objects_new(zend_class_entry *class_type TSRMLS_DC)
        zval *tmp;
 
        intern = emalloc(sizeof(xmlreader_object));
-       intern->std.ce = class_type;
-       intern->std.guards = NULL;
        intern->ptr = NULL;
        intern->input = 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;
index 5c66086eb57ad4cc3c60dab7a1e4096eed3b9e4c..05fc571febe435aaba7d50bff475197d83189f36 100644 (file)
@@ -77,11 +77,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);
 }
 /* }}} */
@@ -96,11 +93,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 *));
 
index 229492f49bc05e92b26c3982b1a795356640b8cb..a408b95f9a6da226fadd72479c91ccc421ce1d09 100644 (file)
@@ -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);