diff --git a/ext/date/lib/interval.c b/ext/date/lib/interval.c index da9262da999b6..35b1ae21b1fab 100644 --- a/ext/date/lib/interval.c +++ b/ext/date/lib/interval.c @@ -201,7 +201,12 @@ int timelib_diff_days(timelib_time *one, timelib_time *two) days--; } } else { - days = fabs(floor(one->sse - two->sse) / 86400); + double diff = fabs(floor(one->sse - two->sse) / 86400); + if (diff > INT_MAX) { + days = INT_MAX; + } else { + days = (int) diff; + } } return days; diff --git a/ext/date/tests/bug19894.phpt b/ext/date/tests/bug19894.phpt new file mode 100644 index 0000000000000..c1d4a36def299 --- /dev/null +++ b/ext/date/tests/bug19894.phpt @@ -0,0 +1,14 @@ +--TEST-- +DateTime::diff() with PHP_INT_MIN timestamp and timezone should not crash +--FILE-- +setTimestamp(PHP_INT_MIN); + +$dateTime = new DateTime(); +$dateTime->setTimezone(new DateTimeZone('America/New_York')); + +echo $dateTime->diff($nowTime)->format('%R %a %H %I %S'), "\n"; +?> +--EXPECTREGEX-- +^[+-] [0-9]+ [0-9]+ [0-9]+ [0-9]+$ \ No newline at end of file