From a503e5f01e583d45539b9c64aa773bbb988a7f42 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 12 Oct 2021 11:32:40 +0200 Subject: [PATCH] Fix #81500: Interval serialization regression since 7.3.14 / 7.4.2 On unserialization the valid range of `DateInterval::$f` is checked, and values outside this range are explicitly marked as invalid (`-1000000`). To avoid confusion, we should do the same when setting the property in the first place. --- ext/date/php_date.c | 7 ++++++- ext/date/tests/bug81500.phpt | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 ext/date/tests/bug81500.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 189e4355f5d46..eb211fb0839a8 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -4331,7 +4331,12 @@ static zval *date_interval_write_property(zval *object, zval *member, zval *valu SET_VALUE_FROM_STRUCT(i, "i"); SET_VALUE_FROM_STRUCT(s, "s"); if (strcmp(Z_STRVAL_P(member), "f") == 0) { - obj->diff->us = zval_get_double(value) * 1000000; + double val = zval_get_double(value) * 1000000; + if (val >= 0 && val < 1000000) { + obj->diff->us = val; + } else { + obj->diff->us = -1000000; + } break; } SET_VALUE_FROM_STRUCT(invert, "invert"); diff --git a/ext/date/tests/bug81500.phpt b/ext/date/tests/bug81500.phpt new file mode 100644 index 0000000000000..8ae6ba63b4c5c --- /dev/null +++ b/ext/date/tests/bug81500.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #81500 (Interval serialization regression since 7.3.14 / 7.4.2) +--FILE-- +f = -0.000001; +var_dump($interval->s, $interval->f); + +$interval = unserialize(serialize($interval)); +var_dump($interval->s, $interval->f); +?> +--EXPECT-- +int(1) +int(-1) +int(1) +int(-1)