time/kunit: Add time64_to_tm() case beyond 32-bit day count

The existing date range test covers +/-80,000 years around the epoch,
far below the day count at which a 32-bit long wraps (2^31 days,
roughly 5.88 million years).

Add a case at exactly 2^31 days after the epoch. Without the preceding
fix a 32-bit kernel returns tm_year=-5879541 and wrong month, day,
day-of-year and weekday; with it the result matches 64-bit kernels.

Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com>
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Assisted-by: LLM
Reviewed-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Link: https://patch.msgid.link/20260925165702.51677-3-kmehltretter@gmail.com
This commit is contained in:
Karl Mehltretter 2026-09-25 18:57:02 +02:00 committed by Thomas Gleixner
parent 2927f7ca78
commit 3945c4a3ea

View File

@ -87,8 +87,24 @@ static void time64_to_tm_test_date_range(struct kunit *test)
}
}
static void time64_to_tm_test_wide_day_count(struct kunit *test)
{
/* 2^31 days: the first count that does not fit in a 32-bit long. */
time64_t timestamp = (1LL << 31) * 86400;
struct tm result;
time64_to_tm(timestamp, 0, &result);
KUNIT_EXPECT_EQ(test, result.tm_year, 5879680);
KUNIT_EXPECT_EQ(test, result.tm_mon, 6);
KUNIT_EXPECT_EQ(test, result.tm_mday, 12);
KUNIT_EXPECT_EQ(test, result.tm_yday, 193);
KUNIT_EXPECT_EQ(test, result.tm_wday, 6);
}
static struct kunit_case time_test_cases[] = {
KUNIT_CASE_SLOW(time64_to_tm_test_date_range),
KUNIT_CASE(time64_to_tm_test_wide_day_count),
{}
};