From 84f729c2b4dea4c6abf8aad69928dfe4cf72fb32 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 23 Aug 2020 21:37:03 -0400 Subject: LibJS+LibC: Add tests for Date tuple ctor overflow and make mktime()/timegm() handle month overflow --- Libraries/LibC/time.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'Libraries/LibC') diff --git a/Libraries/LibC/time.cpp b/Libraries/LibC/time.cpp index a3fe523de2..018ccf6cda 100644 --- a/Libraries/LibC/time.cpp +++ b/Libraries/LibC/time.cpp @@ -103,6 +103,13 @@ static void time_to_tm(struct tm* tm, time_t t) static time_t tm_to_time(struct tm* tm, long timezone_adjust_seconds) { + tm->tm_year += tm->tm_mon / 12; + tm->tm_mon %= 12; + if (tm->tm_mon < 0) { + tm->tm_year--; + tm->tm_mon += 12; + } + int days = 0; for (int year = 70; year < tm->tm_year; ++year) days += 365 + __is_leap_year(1900 + year); @@ -110,7 +117,6 @@ static time_t tm_to_time(struct tm* tm, long timezone_adjust_seconds) days -= 365 + __is_leap_year(1900 + year); tm->tm_yday = tm->tm_mday - 1; - // FIXME: What if tm->tm_mon < 0 or tm->tm_mon > 12? for (int month = 0; month < tm->tm_mon; ++month) tm->tm_yday += __days_per_month[month]; if (tm->tm_mon > 1 && __is_leap_year(1900 + tm->tm_year)) -- cgit v1.2.3