]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
parse_date: handle dates in 2038 and beyond if time_t is big enough 2742/head
authorBrad King <brad.king@kitware.com>
Fri, 26 Sep 2025 21:08:00 +0000 (17:08 -0400)
committerBrad King <brad.king@kitware.com>
Fri, 26 Sep 2025 21:48:56 +0000 (17:48 -0400)
libarchive/archive_parse_date.c
libarchive/test/test_archive_parse_date.c

index cda0b11a555ff99b9af191fb50a2fb91bbde8179..d9e968387d347c2c5f3a25a445047b491aac8582 100644 (file)
@@ -703,9 +703,7 @@ Convert(time_t Month, time_t Day, time_t Year,
                Year += 1900;
        DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
            ? 29 : 28;
-       /* Checking for 2038 bogusly assumes that time_t is 32 bits.  But
-          I'm too lazy to try to check for time_t overflow in another way.  */
-       if (Year < EPOCH || Year >= 2038
+       if (Year < EPOCH || (sizeof(time_t) <= 4 && Year >= 2038)
            || Month < 1 || Month > 12
            /* Lint fluff:  "conversion from long may lose accuracy" */
            || Day < 1 || Day > DaysInMonth[(int)--Month]
index 0a70971b1da6b0cc5ac9b7dc1fd8fdd430c3c099..5251b3393999ee75adc34474c26834e714dcf10e 100644 (file)
@@ -39,6 +39,8 @@ DEFINE_TEST(test_archive_parse_date)
        assertEqualInt(get_date(now, "Jan 1, 1970 UTC"), 0);
        assertEqualInt(get_date(now, "7:12:18-0530 4 May 1983"), 420900138);
        assertEqualInt(get_date(now, "2004/01/29 513 mest"), 1075345980);
+       assertEqualInt(get_date(now, "2038-06-01 00:01:02 UTC"),
+           sizeof(time_t) <= 4 ? -1 : 2158963262);
        assertEqualInt(get_date(now, "99/02/17 7pm utc"), 919278000);
        assertEqualInt(get_date(now, "02/17/99 7:11am est"), 919253460);
        assertEqualInt(get_date(now, "now - 2 hours"),