summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Wallner <mike@php.net>2006-08-15 06:53:21 +0000
committerMichael Wallner <mike@php.net>2006-08-15 06:53:21 +0000
commitf5ea2dfac4c68e73b587069a9683e8dd8cdbf97e (patch)
treebba1cd4745927876f826cfd62cb8c39535e0c371
parent9a79a2f37cc4d2dc2e48c9a3d9f6bd19924ef48e (diff)
downloadphp-git-f5ea2dfac4c68e73b587069a9683e8dd8cdbf97e.tar.gz
MFH:
- fix leak when cloning DateTimeZone, detected by Antony - don't fetch objects multiple times when cloning
-rw-r--r--ext/date/php_date.c16
-rw-r--r--ext/date/tests/oo_002.phpt2
2 files changed, 8 insertions, 10 deletions
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index ed46a3be60..99edbc0f45 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -1497,12 +1497,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();
@@ -1545,13 +1544,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;
}
diff --git a/ext/date/tests/oo_002.phpt b/ext/date/tests/oo_002.phpt
index 79cec9eb5f..a83cb583b6 100644
--- a/ext/date/tests/oo_002.phpt
+++ b/ext/date/tests/oo_002.phpt
@@ -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());