From: Michael Wallner Date: Tue, 1 Aug 2006 15:54:45 +0000 (+0000) Subject: - fix leaks on multiple calls to DateTime::__construct() X-Git-Tag: RELEASE_1_0_0RC1~2148 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c5db30db85e4bfd820610596150037185ed88250;p=php - fix leaks on multiple calls to DateTime::__construct() - throw exception on unparseable time strings in DateTime::__construct() # I guess I'm done now --- diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 0007436d56..f03f5e92b9 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1672,9 +1672,22 @@ static void 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; - dateobj->time = timelib_strtotime(time_str_len ? time_str : "now", time_str_len ? time_str_len : sizeof("now") -1, NULL, DATE_TIMEZONEDB); + if (dateobj->time) { + if (dateobj->time->tz_info) { + timelib_tzinfo_dtor(dateobj->time->tz_info); + } + timelib_time_dtor(dateobj->time); + } + dateobj->time = timelib_strtotime(time_str_len ? time_str : "now", time_str_len ? time_str_len : sizeof("now") -1, &err, DATE_TIMEZONEDB); + if (err) { + if (err->error_count) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse time string (%s)", time_str); + } + timelib_error_container_dtor(err); + } if (timezone_object) { php_timezone_obj *tzobj; @@ -1727,8 +1740,9 @@ PHP_METHOD(DateTime, __construct) int time_str_len = 0; if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO", &time_str, &time_str_len, &timezone_object, date_ce_timezone)) { - /* TODO: throw Exception on unparseable dates */ + php_set_error_handling(EH_THROW, NULL TSRMLS_CC); date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, timezone_object TSRMLS_CC); + php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); } }