From: Derick Rethans Date: Tue, 11 Apr 2006 17:56:49 +0000 (+0000) Subject: - Fixed bug #36988 (mktime freezes on long numbers) X-Git-Tag: RELEASE_1_3~91 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9844b76e5620aae299bf8a6d441eeee6f89e61e1;p=php - Fixed bug #36988 (mktime freezes on long numbers) --- diff --git a/ext/date/lib/timelib_structs.h b/ext/date/lib/timelib_structs.h index 55831dbd09..373fecb9c2 100644 --- a/ext/date/lib/timelib_structs.h +++ b/ext/date/lib/timelib_structs.h @@ -183,9 +183,10 @@ typedef struct _timelib_tzdb { #define TIMELIB_ZONETYPE_ABBR 2 #define TIMELIB_ZONETYPE_ID 3 -#define SECS_PER_DAY 86400 -#define DAYS_PER_YEAR 365 -#define DAYS_PER_LYEAR 366 +#define SECS_PER_ERA 12622780800L +#define SECS_PER_DAY 86400 +#define DAYS_PER_YEAR 365 +#define DAYS_PER_LYEAR 366 #define timelib_is_leap(y) ((y) % 4 == 0 && ((y) % 100 != 0 || (y) % 400 == 0)) diff --git a/ext/date/lib/tm2unixtime.c b/ext/date/lib/tm2unixtime.c index cb4cfeba3a..70094dcad3 100644 --- a/ext/date/lib/tm2unixtime.c +++ b/ext/date/lib/tm2unixtime.c @@ -135,6 +135,13 @@ static timelib_sll do_years(timelib_sll year) { timelib_sll i; timelib_sll res = 0; + timelib_sll eras; + + eras = (year - 1970) / 400; + if (eras != 0) { + year = year - (eras * 400); + res += (SECS_PER_ERA * eras); + } if (year >= 1970) { for (i = year - 1; i >= 1970; i--) { diff --git a/ext/date/tests/bug36988.phpt b/ext/date/tests/bug36988.phpt new file mode 100644 index 0000000000..e9fd69d7ef --- /dev/null +++ b/ext/date/tests/bug36988.phpt @@ -0,0 +1,10 @@ +--TEST-- +Bug #36988 (mktime freezes on long numbers) +--FILE-- + +--EXPECT-- +smaller than one second