mirror of
https://github.com/php/php-src.git
synced 2026-03-24 16:22:37 +01:00
- MFH: Fixed bug #43808 (date_create never fails (even when it should)).
This commit is contained in:
1
NEWS
1
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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
48
ext/date/tests/bug43808.phpt
Normal file
48
ext/date/tests/bug43808.phpt
Normal file
@@ -0,0 +1,48 @@
|
||||
--TEST--
|
||||
Bug #43808 (date_create never fails (even when it should))
|
||||
--FILE--
|
||||
<?php
|
||||
$date = date_create('asdfasdf');
|
||||
|
||||
if ($date instanceof DateTime) {
|
||||
echo "this is wrong, should be bool";
|
||||
}
|
||||
|
||||
var_dump( $date );
|
||||
var_dump( DateTime::getLastErrors() );
|
||||
var_dump( date_get_last_errors() );
|
||||
?>
|
||||
--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"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user