]> granicus.if.org Git - php/commitdiff
- fix leak when cloning DateTimeZone, detected by Antony
authorMichael Wallner <mike@php.net>
Tue, 15 Aug 2006 06:53:02 +0000 (06:53 +0000)
committerMichael Wallner <mike@php.net>
Tue, 15 Aug 2006 06:53:02 +0000 (06:53 +0000)
- don't fetch objects multiple times when cloning

ext/date/php_date.c
ext/date/tests/oo_002.phpt

index bb564ea7e694b6b5cda0c6fa4ed185fa95d129df..116e9cac7d25e6b1ff819d43a6058dbc30140db3 100644 (file)
@@ -1625,12 +1625,11 @@ static zend_object_value date_object_new_date(zend_class_entry *class_type TSRML
 
 static zend_object_value date_object_clone_date(zval *this_ptr TSRMLS_DC)
 {
-       zend_object *old_zo = zend_objects_get_address(this_ptr TSRMLS_CC);
-       php_date_obj *old_obj = (php_date_obj *) zend_object_store_get_object(this_ptr TSRMLS_CC);
        php_date_obj *new_obj = NULL;
-       zend_object_value new_ov = date_object_new_date_ex(old_zo->ce, &new_obj TSRMLS_CC);
+       php_date_obj *old_obj = (php_date_obj *) zend_object_store_get_object(this_ptr TSRMLS_CC);
+       zend_object_value new_ov = date_object_new_date_ex(old_obj->std.ce, &new_obj TSRMLS_CC);
        
-       zend_objects_clone_members(&new_obj->std, new_ov, old_zo, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC);
+       zend_objects_clone_members(&new_obj->std, new_ov, &old_obj->std, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC);
        
        /* this should probably moved to a new `timelib_time *timelime_time_clone(timelib_time *)` */
        new_obj->time = timelib_time_ctor();
@@ -1673,13 +1672,12 @@ static zend_object_value date_object_new_timezone(zend_class_entry *class_type T
 
 static zend_object_value date_object_clone_timezone(zval *this_ptr TSRMLS_DC)
 {
-       zend_object *old_zo = zend_objects_get_address(this_ptr TSRMLS_CC);
-       php_timezone_obj *old_obj = (php_timezone_obj *) zend_object_store_get_object(this_ptr TSRMLS_CC);
        php_timezone_obj *new_obj = NULL;
-       zend_object_value new_ov = date_object_new_timezone_ex(old_zo->ce, &new_obj TSRMLS_CC);
+       php_timezone_obj *old_obj = (php_timezone_obj *) zend_object_store_get_object(this_ptr TSRMLS_CC);
+       zend_object_value new_ov = date_object_new_timezone_ex(old_obj->std.ce, &new_obj TSRMLS_CC);
        
-       zend_objects_clone_members(&new_obj->std, new_ov, old_zo, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC);
-       new_obj->tz = timelib_tzinfo_clone(old_obj->tz);
+       zend_objects_clone_members(&new_obj->std, new_ov, &old_obj->std, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC);
+       new_obj->tz = old_obj->tz;
        
        return new_ov;
 }
index 79cec9eb5f6216cfa2b3bcde64f8c3815fa54c60..a83cb583b6babd811980b5e9a967783f90d57273 100644 (file)
@@ -14,7 +14,7 @@ $d->modify("1 hour after");
 $c->modify("1 second ago");
 var_dump($d->format(DateTime::RFC822));
 var_dump($c->format(DateTime::RFC822));
-$t = new DateTimeZone("Asia/Tokyo");
+$t = new _t("Asia/Tokyo");
 var_dump($t->getName());
 $c = clone $t;
 var_dump($c->getName());