diff --git a/NEWS b/NEWS index 3ff17751409..2028649849b 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,9 @@ PHP NEWS . Fixed bug #78656 (Parse errors classified as highest log-level). (Erik Lundin) +- Date: + . Fixed bug #70153 (\DateInterval incorrectly unserialized). (Maksim Iakunin) + - Iconv: . Fixed bug #78642 (Wrong libiconv version displayed). (gedas at martynas, cmb). diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 0bde5430324..f82abc64867 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -4364,6 +4364,20 @@ static int php_date_interval_initialize_from_hash(zval **return_value, php_inter } \ } while (0); +#define PHP_DATE_INTERVAL_READ_PROPERTY_DAYS(member) \ + do { \ + zval *z_arg = zend_hash_str_find(myht, "days", sizeof("days") - 1); \ + if (z_arg && Z_TYPE_P(z_arg) == IS_FALSE) { \ + (*intobj)->diff->member = -99999; \ + } else if (z_arg && Z_TYPE_P(z_arg) <= IS_STRING) { \ + zend_string *str = zval_get_string(z_arg); \ + DATE_A64I((*intobj)->diff->member, ZSTR_VAL(str)); \ + zend_string_release(str); \ + } else { \ + (*intobj)->diff->member = -1LL; \ + } \ + } while (0); + #define PHP_DATE_INTERVAL_READ_PROPERTY_DOUBLE(element, member, def) \ do { \ zval *z_arg = zend_hash_str_find(myht, element, sizeof(element) - 1); \ @@ -4392,7 +4406,7 @@ static int php_date_interval_initialize_from_hash(zval **return_value, php_inter PHP_DATE_INTERVAL_READ_PROPERTY("weekday_behavior", weekday_behavior, int, -1) PHP_DATE_INTERVAL_READ_PROPERTY("first_last_day_of", first_last_day_of, int, -1) PHP_DATE_INTERVAL_READ_PROPERTY("invert", invert, int, 0); - PHP_DATE_INTERVAL_READ_PROPERTY_I64("days", days); + PHP_DATE_INTERVAL_READ_PROPERTY_DAYS(days); PHP_DATE_INTERVAL_READ_PROPERTY("special_type", special.type, unsigned int, 0); PHP_DATE_INTERVAL_READ_PROPERTY_I64("special_amount", special.amount); PHP_DATE_INTERVAL_READ_PROPERTY("have_weekday_relative", have_weekday_relative, unsigned int, 0); diff --git a/ext/date/tests/bug48678.phpt b/ext/date/tests/bug48678.phpt index 9565cb2dfbf..6f97d614099 100644 --- a/ext/date/tests/bug48678.phpt +++ b/ext/date/tests/bug48678.phpt @@ -39,7 +39,7 @@ DateInterval Object [weekday_behavior] => 0 [first_last_day_of] => 0 [invert] => 0 - [days] => 0 + [days] => [special_type] => 0 [special_amount] => 0 [have_weekday_relative] => 0 diff --git a/ext/date/tests/bug53437.phpt b/ext/date/tests/bug53437.phpt index 0be9691a140..3c94bd53130 100644 --- a/ext/date/tests/bug53437.phpt +++ b/ext/date/tests/bug53437.phpt @@ -136,7 +136,7 @@ object(DatePeriod)#5 (6) { ["invert"]=> int(0) ["days"]=> - int(0) + bool(false) ["special_type"]=> int(0) ["special_amount"]=> diff --git a/ext/date/tests/bug53437_var2.phpt b/ext/date/tests/bug53437_var2.phpt index 2ef21e738e5..51cc28943be 100644 --- a/ext/date/tests/bug53437_var2.phpt +++ b/ext/date/tests/bug53437_var2.phpt @@ -71,7 +71,7 @@ object(DateInterval)#2 (16) { ["invert"]=> int(0) ["days"]=> - int(0) + bool(false) ["special_type"]=> int(0) ["special_amount"]=> diff --git a/ext/date/tests/bug70153.phpt b/ext/date/tests/bug70153.phpt new file mode 100644 index 00000000000..5b965207fc2 --- /dev/null +++ b/ext/date/tests/bug70153.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #70153 (\DateInterval incorrectly unserialized) +--FILE-- +days, $i2->days); +var_dump($i2->special_amount, $i2->special_amount); +?> +--EXPECT-- +bool(false) +bool(false) +int(0) +int(0)