]> granicus.if.org Git - php/commitdiff
Fix #70153 \DateInterval incorrectly unserialized
authorm.yakunin <m.yakunin@8bitgroup.com>
Mon, 16 Sep 2019 16:50:55 +0000 (18:50 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Fri, 18 Oct 2019 13:31:14 +0000 (15:31 +0200)
Added a separate macro for reading 'days' property, so that bool(false)
is correctly converted to the proper internal representation.

NEWS
ext/date/php_date.c
ext/date/tests/bug48678.phpt
ext/date/tests/bug53437.phpt
ext/date/tests/bug53437_var2.phpt
ext/date/tests/bug70153.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 3ff1775140975c30967f9158d348e472affbe373..2028649849bfbcf55d9504560e30e640b73bf1c5 100644 (file)
--- 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).
index 0bde5430324d885ae8b538f6b68b5174988a7524..f82abc648676f26139ec6554bee8a4958be825db 100644 (file)
@@ -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);
index 9565cb2dfbf25417bb31be015cd3253c343ede99..6f97d614099b232d8e9b8e1b11bcf7529854ffb0 100644 (file)
@@ -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
index 0be9691a1401000aa2ab31daf5a072c5268aff60..3c94bd53130887ce4fcd0bbf16ef03f28c4b5633 100644 (file)
@@ -136,7 +136,7 @@ object(DatePeriod)#5 (6) {
     ["invert"]=>
     int(0)
     ["days"]=>
-    int(0)
+    bool(false)
     ["special_type"]=>
     int(0)
     ["special_amount"]=>
index 2ef21e738e5fa2a0660127c4da329bbf9131abd3..51cc28943be32631a1fcabb82a74f3189bbbc121 100644 (file)
@@ -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 (file)
index 0000000..5b96520
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+Bug #70153 (\DateInterval incorrectly unserialized)
+--FILE--
+<?php
+$i1 = \DateInterval::createFromDateString('+1 month');
+$i2 = unserialize(serialize($i1));
+var_dump($i1->days, $i2->days);
+var_dump($i2->special_amount, $i2->special_amount);
+?>
+--EXPECT--
+bool(false)
+bool(false)
+int(0)
+int(0)