Browse Source

- Fixed memory leaks and segfaults, patch by Joe Orton.

- Fixed bug #45038 (Crash when using DateTimeZone object returned by
  Date::getTimezone).
experimental/first_unicode_implementation
Derick Rethans 18 years ago
parent
commit
698b0f818f
  1. 47
      ext/date/php_date.c
  2. 19
      ext/date/tests/015.phpt
  3. 13
      ext/date/tests/dateinterval_errors.phpt

47
ext/date/php_date.c

@ -1341,14 +1341,6 @@ PHP_FUNCTION(strtotime)
timelib_update_ts(t, tzi);
ts = timelib_date_to_int(t, &error2);
/* if tz_info is not a copy, avoid double free */
if (now->tz_info != tzi && now->tz_info) {
timelib_tzinfo_dtor(now->tz_info);
}
if (t->tz_info != tzi) {
timelib_tzinfo_dtor(t->tz_info);
}
timelib_time_dtor(now);
timelib_time_dtor(t);
@ -1779,7 +1771,7 @@ static void date_period_it_current_data(zend_object_iterator *iter, zval ***data
newdateobj->time->tz_abbr = strdup(it_time->tz_abbr);
}
if (it_time->tz_info) {
newdateobj->time->tz_info = timelib_tzinfo_clone(it_time->tz_info);
newdateobj->time->tz_info = it_time->tz_info;
}
*data = &iterator->current;
@ -1966,7 +1958,7 @@ static zend_object_value date_object_clone_date(zval *this_ptr TSRMLS_DC)
new_obj->time->tz_abbr = strdup(old_obj->time->tz_abbr);
}
if (old_obj->time->tz_info) {
new_obj->time->tz_info = timelib_tzinfo_clone(old_obj->time->tz_info);
new_obj->time->tz_info = old_obj->time->tz_info;
}
return new_ov;
@ -2185,9 +2177,6 @@ static void date_object_free_storage_date(void *object TSRMLS_DC)
php_date_obj *intern = (php_date_obj *)object;
if (intern->time) {
if (intern->time->tz_info) {
timelib_tzinfo_dtor(intern->time->tz_info);
}
timelib_time_dtor(intern->time);
}
@ -2220,16 +2209,10 @@ static void date_object_free_storage_period(void *object TSRMLS_DC)
php_period_obj *intern = (php_period_obj *)object;
if (intern->start) {
if (intern->start->tz_info) {
timelib_tzinfo_dtor(intern->start->tz_info);
}
timelib_time_dtor(intern->start);
}
if (intern->end) {
if (intern->end->tz_info) {
timelib_tzinfo_dtor(intern->end->tz_info);
}
timelib_time_dtor(intern->end);
}
@ -2268,14 +2251,11 @@ static int date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int
timelib_time *now;
timelib_tzinfo *tzi;
timelib_error_container *err = NULL;
int free_tzi = 0, type = TIMELIB_ZONETYPE_ID, new_dst;
int type = TIMELIB_ZONETYPE_ID, new_dst;
char *new_abbr;
timelib_sll new_offset;
if (dateobj->time) {
if (dateobj->time->tz_info) {
timelib_tzinfo_dtor(dateobj->time->tz_info);
}
timelib_time_dtor(dateobj->time);
}
if (format) {
@ -2303,8 +2283,7 @@ static int date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int
tzobj = (php_timezone_obj *) zend_object_store_get_object(timezone_object TSRMLS_CC);
switch (tzobj->type) {
case TIMELIB_ZONETYPE_ID:
tzi = timelib_tzinfo_clone(tzobj->tzi.tz);
free_tzi = 1;
tzi = tzobj->tzi.tz;
break;
case TIMELIB_ZONETYPE_OFFSET:
new_offset = tzobj->tzi.utc_offset;
@ -2317,8 +2296,7 @@ static int date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int
}
type = tzobj->type;
} else if (dateobj->time->tz_info) {
tzi = timelib_tzinfo_clone(dateobj->time->tz_info);
free_tzi = 1;
tzi = dateobj->time->tz_info;
} else {
tzi = get_timezone_info(TSRMLS_C);
}
@ -2345,12 +2323,6 @@ static int date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int
dateobj->time->have_relative = 0;
if (type == TIMELIB_ZONETYPE_ID && now->tz_info != tzi) {
timelib_tzinfo_dtor(now->tz_info);
}
if (free_tzi) {
timelib_tzinfo_dtor(tzi);
}
timelib_time_dtor(now);
return 1;
@ -2860,10 +2832,7 @@ PHP_FUNCTION(date_timezone_set)
if (tzobj->type != TIMELIB_ZONETYPE_ID) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can only do this for zones with ID for now");
}
if (dateobj->time->tz_info) {
timelib_tzinfo_dtor(dateobj->time->tz_info);
}
timelib_set_timezone(dateobj->time, timelib_tzinfo_clone(tzobj->tzi.tz));
timelib_set_timezone(dateobj->time, tzobj->tzi.tz);
timelib_unixtime2local(dateobj->time, dateobj->time->sse);
}
/* }}} */
@ -3613,7 +3582,7 @@ PHP_METHOD(DatePeriod, __construct)
clone->tz_abbr = strdup(dateobj->time->tz_abbr);
}
if (dateobj->time->tz_info) {
clone->tz_info = timelib_tzinfo_clone(dateobj->time->tz_info);
clone->tz_info = dateobj->time->tz_info;
}
dpobj->start = clone;
@ -3629,7 +3598,7 @@ PHP_METHOD(DatePeriod, __construct)
clone->tz_abbr = strdup(dateobj->time->tz_abbr);
}
if (dateobj->time->tz_info) {
clone->tz_info = timelib_tzinfo_clone(dateobj->time->tz_info);
clone->tz_info = dateobj->time->tz_info;
}
dpobj->end = clone;
}

19
ext/date/tests/015.phpt

@ -0,0 +1,19 @@
--TEST--
timezone object reference handling
--INI--
date.timezone=UTC
--FILE--
<?php
$dto = new DateTime();
$tzold = $dto->getTimezone();
var_dump($tzold->getName());
$dto->setTimezone(new DateTimeZone('US/Eastern'));
var_dump($tzold->getName());
var_dump($dto->getTimezone()->getName());
echo "Done\n";
?>
--EXPECTF--
unicode(3) "UTC"
unicode(3) "UTC"
unicode(10) "US/Eastern"
Done

13
ext/date/tests/dateinterval_errors.phpt

@ -0,0 +1,13 @@
--TEST--
DateInterval: Getter and setter errors
--FILE--
<?php
$d = DateInterval::createFromDateString("");
$d->y = 1984;
var_dump($d->y);
var_dump($d->asdf, $d->y);
?>
--EXPECTF--
int(1984)
Fatal error: main(): Unknown property (asdf) in %sdateinterval_errors.php on line 5
Loading…
Cancel
Save