From 3fb0e425e0aeaf4eda32ed78cc3c19dcfe1a8a76 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Thu, 17 Jan 2008 20:35:02 +0000 Subject: [PATCH] - MFH: Fixed bug #43808 (date_create never fails (even when it should)). --- NEWS | 1 + ext/date/php_date.c | 26 +++++++++++++++---- ext/date/tests/bug43808.phpt | 48 ++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 ext/date/tests/bug43808.phpt diff --git a/NEWS b/NEWS index 9e96c19b84..405cada2ec 100644 --- a/NEWS +++ b/NEWS @@ -77,6 +77,7 @@ PHP NEWS - Fixed possible crash in ext/soap because of uninitialized value. (Zdash Urf) +- Fixed bug #43808 (date_create never fails (even when it should)). (Derick) - Fixed bug #43527 (DateTime created from a timestamp reports environment timezone). (Derick) - Fixed bug #43003 (Invalid timezone reported for DateTime objects constructed diff --git a/ext/date/php_date.c b/ext/date/php_date.c index fe0fae275f..598ee79487 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1702,7 +1702,7 @@ static void update_errors_warnings(timelib_error_container *last_errors TSRMLS_D DATEG(last_errors) = last_errors; } -static void date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int time_str_len, char *format, zval *timezone_object TSRMLS_DC) +static int date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int time_str_len, char *format, zval *timezone_object, int ctor TSRMLS_DC) { timelib_time *now; timelib_tzinfo *tzi; @@ -1726,6 +1726,16 @@ static void date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int // update last errors and warnings update_errors_warnings(err TSRMLS_CC); + + if (ctor && err && err->error_count) { + /* spit out the first library error message, at least */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", time_str, + err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message); + } + if (err && err->error_count) { + return 0; + } + if (timezone_object) { php_timezone_obj *tzobj; @@ -1780,7 +1790,9 @@ static void date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int if (free_tzi) { timelib_tzinfo_dtor(tzi); } - timelib_time_dtor(now); + timelib_time_dtor(now); + + return 1; } /* {{{ proto DateTime date_create([string time[, DateTimeZone object]]) @@ -1797,7 +1809,9 @@ PHP_FUNCTION(date_create) } date_instantiate(date_ce_date, return_value TSRMLS_CC); - date_initialize(zend_object_store_get_object(return_value TSRMLS_CC), time_str, time_str_len, NULL, timezone_object TSRMLS_CC); + if (!date_initialize(zend_object_store_get_object(return_value TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 0 TSRMLS_CC)) { + RETURN_FALSE; + } } /* }}} */ @@ -1815,7 +1829,9 @@ PHP_FUNCTION(date_create_from_format) } date_instantiate(date_ce_date, return_value TSRMLS_CC); - date_initialize(zend_object_store_get_object(return_value TSRMLS_CC), time_str, time_str_len, format_str, timezone_object TSRMLS_CC); + if (!date_initialize(zend_object_store_get_object(return_value TSRMLS_CC), time_str, time_str_len, format_str, timezone_object, 0 TSRMLS_CC)) { + RETURN_FALSE; + } } /* }}} */ @@ -1830,7 +1846,7 @@ PHP_METHOD(DateTime, __construct) php_set_error_handling(EH_THROW, NULL TSRMLS_CC); if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO", &time_str, &time_str_len, &timezone_object, date_ce_timezone)) { - date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, NULL, timezone_object TSRMLS_CC); + date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 1 TSRMLS_CC); } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); } diff --git a/ext/date/tests/bug43808.phpt b/ext/date/tests/bug43808.phpt new file mode 100644 index 0000000000..74b2317a20 --- /dev/null +++ b/ext/date/tests/bug43808.phpt @@ -0,0 +1,48 @@ +--TEST-- +Bug #43808 (date_create never fails (even when it should)) +--FILE-- + +--EXPECT-- +bool(false) +array(4) { + ["warning_count"]=> + int(1) + ["warnings"]=> + array(1) { + [6]=> + string(29) "Double timezone specification" + } + ["error_count"]=> + int(1) + ["errors"]=> + array(1) { + [0]=> + string(47) "The timezone could not be found in the database" + } +} +array(4) { + ["warning_count"]=> + int(1) + ["warnings"]=> + array(1) { + [6]=> + string(29) "Double timezone specification" + } + ["error_count"]=> + int(1) + ["errors"]=> + array(1) { + [0]=> + string(47) "The timezone could not be found in the database" + } +} -- 2.50.1