mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Fixed GH-8471: Segmentation fault when converting immutable and mutable DateTime instances created using reflection
This commit is contained in:
parent
710294c9a5
commit
92f8f19d50
2 changed files with 62 additions and 4 deletions
|
@ -2468,8 +2468,10 @@ PHP_METHOD(DateTime, createFromImmutable)
|
||||||
Z_PARAM_OBJECT_OF_CLASS(datetimeimmutable_object, date_ce_immutable)
|
Z_PARAM_OBJECT_OF_CLASS(datetimeimmutable_object, date_ce_immutable)
|
||||||
ZEND_PARSE_PARAMETERS_END();
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
|
||||||
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_date, return_value);
|
|
||||||
old_obj = Z_PHPDATE_P(datetimeimmutable_object);
|
old_obj = Z_PHPDATE_P(datetimeimmutable_object);
|
||||||
|
DATE_CHECK_INITIALIZED(old_obj->time, DateTimeImmutable);
|
||||||
|
|
||||||
|
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_date, return_value);
|
||||||
new_obj = Z_PHPDATE_P(return_value);
|
new_obj = Z_PHPDATE_P(return_value);
|
||||||
|
|
||||||
new_obj->time = timelib_time_clone(old_obj->time);
|
new_obj->time = timelib_time_clone(old_obj->time);
|
||||||
|
@ -2487,8 +2489,10 @@ PHP_METHOD(DateTime, createFromInterface)
|
||||||
Z_PARAM_OBJECT_OF_CLASS(datetimeinterface_object, date_ce_interface)
|
Z_PARAM_OBJECT_OF_CLASS(datetimeinterface_object, date_ce_interface)
|
||||||
ZEND_PARSE_PARAMETERS_END();
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
|
||||||
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_date, return_value);
|
|
||||||
old_obj = Z_PHPDATE_P(datetimeinterface_object);
|
old_obj = Z_PHPDATE_P(datetimeinterface_object);
|
||||||
|
DATE_CHECK_INITIALIZED(old_obj->time, DateTimeInterface);
|
||||||
|
|
||||||
|
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_date, return_value);
|
||||||
new_obj = Z_PHPDATE_P(return_value);
|
new_obj = Z_PHPDATE_P(return_value);
|
||||||
|
|
||||||
new_obj->time = timelib_time_clone(old_obj->time);
|
new_obj->time = timelib_time_clone(old_obj->time);
|
||||||
|
@ -2506,8 +2510,10 @@ PHP_METHOD(DateTimeImmutable, createFromMutable)
|
||||||
Z_PARAM_OBJECT_OF_CLASS(datetime_object, date_ce_date)
|
Z_PARAM_OBJECT_OF_CLASS(datetime_object, date_ce_date)
|
||||||
ZEND_PARSE_PARAMETERS_END();
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
|
||||||
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_immutable, return_value);
|
|
||||||
old_obj = Z_PHPDATE_P(datetime_object);
|
old_obj = Z_PHPDATE_P(datetime_object);
|
||||||
|
DATE_CHECK_INITIALIZED(old_obj->time, DateTime);
|
||||||
|
|
||||||
|
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_immutable, return_value);
|
||||||
new_obj = Z_PHPDATE_P(return_value);
|
new_obj = Z_PHPDATE_P(return_value);
|
||||||
|
|
||||||
new_obj->time = timelib_time_clone(old_obj->time);
|
new_obj->time = timelib_time_clone(old_obj->time);
|
||||||
|
@ -2525,8 +2531,10 @@ PHP_METHOD(DateTimeImmutable, createFromInterface)
|
||||||
Z_PARAM_OBJECT_OF_CLASS(datetimeinterface_object, date_ce_interface)
|
Z_PARAM_OBJECT_OF_CLASS(datetimeinterface_object, date_ce_interface)
|
||||||
ZEND_PARSE_PARAMETERS_END();
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
|
||||||
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_immutable, return_value);
|
|
||||||
old_obj = Z_PHPDATE_P(datetimeinterface_object);
|
old_obj = Z_PHPDATE_P(datetimeinterface_object);
|
||||||
|
DATE_CHECK_INITIALIZED(old_obj->time, DateTimeInterface);
|
||||||
|
|
||||||
|
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_immutable, return_value);
|
||||||
new_obj = Z_PHPDATE_P(return_value);
|
new_obj = Z_PHPDATE_P(return_value);
|
||||||
|
|
||||||
new_obj->time = timelib_time_clone(old_obj->time);
|
new_obj->time = timelib_time_clone(old_obj->time);
|
||||||
|
|
50
ext/date/tests/bug-gh8471.phpt
Normal file
50
ext/date/tests/bug-gh8471.phpt
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
--TEST--
|
||||||
|
Bug GH-8471: Segmentation fault when converting immutable and mutable DateTime instances created using reflection
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$reflection = new ReflectionClass('\DateTime');
|
||||||
|
|
||||||
|
$mutable = $reflection->newInstanceWithoutConstructor();
|
||||||
|
try {
|
||||||
|
$immutable = \DateTimeImmutable::createFromMutable($mutable);
|
||||||
|
} catch (Throwable $t) {
|
||||||
|
echo $t->getMessage(), "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$reflection = new ReflectionClass('\DateTime');
|
||||||
|
|
||||||
|
$mutable = $reflection->newInstanceWithoutConstructor();
|
||||||
|
try {
|
||||||
|
$immutable = \DateTimeImmutable::createFromInterface($mutable);
|
||||||
|
} catch (Throwable $t) {
|
||||||
|
echo $t->getMessage(), "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$reflection = new ReflectionClass('\DateTimeImmutable');
|
||||||
|
|
||||||
|
$immutable = $reflection->newInstanceWithoutConstructor();
|
||||||
|
try {
|
||||||
|
$mutable = \DateTime::createFromImmutable($immutable);
|
||||||
|
} catch (Throwable $t) {
|
||||||
|
echo $t->getMessage(), "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$reflection = new ReflectionClass('\DateTimeImmutable');
|
||||||
|
|
||||||
|
$immutable = $reflection->newInstanceWithoutConstructor();
|
||||||
|
try {
|
||||||
|
$mutable = \DateTime::createFromInterface($immutable);
|
||||||
|
} catch (Throwable $t) {
|
||||||
|
echo $t->getMessage(), "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
The DateTime object has not been correctly initialized by its constructor
|
||||||
|
The DateTimeInterface object has not been correctly initialized by its constructor
|
||||||
|
The DateTimeImmutable object has not been correctly initialized by its constructor
|
||||||
|
The DateTimeInterface object has not been correctly initialized by its constructor
|
Loading…
Add table
Add a link
Reference in a new issue