From 7c47afa888cceb290ad3147a1cf91a335e564ef1 Mon Sep 17 00:00:00 2001 From: MarkLee131 Date: Sat, 25 Apr 2026 17:34:58 +0800 Subject: [PATCH] test: cover ParseServerTime out-of-range year rejection (#2008) --- test/UtilsTest.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/test/UtilsTest.cpp b/test/UtilsTest.cpp index 30571a67..37ac2027 100644 --- a/test/UtilsTest.cpp +++ b/test/UtilsTest.cpp @@ -161,6 +161,31 @@ TEST(UtilsTest, ParseServerTime) { tzset(); } +TEST(UtilsTest, ParseServerTimeOutOfRange) { + // Years past 5 digits trigger int64 overflow inside cctz' microseconds + // conversion (`seconds * 1_000_000`). Reject up front (#2008). + timeval tv = CUtils::ParseServerTime("999999-01-01T00:00:00.000Z"); + EXPECT_EQ(tv.tv_sec, 0); + EXPECT_EQ(tv.tv_usec, 0); + + tv = CUtils::ParseServerTime("12345678-01-01T00:00:00.000Z"); + EXPECT_EQ(tv.tv_sec, 0); + EXPECT_EQ(tv.tv_usec, 0); + + // Junk and empty input still return a zeroed timeval. + tv = CUtils::ParseServerTime(""); + EXPECT_EQ(tv.tv_sec, 0); + EXPECT_EQ(tv.tv_usec, 0); + + tv = CUtils::ParseServerTime("not-a-date-at-all"); + EXPECT_EQ(tv.tv_sec, 0); + EXPECT_EQ(tv.tv_usec, 0); + + // Canonical input still parses (regression). + tv = CUtils::ParseServerTime("2011-10-19T16:40:51.620Z"); + EXPECT_EQ(CUtils::FormatServerTime(tv), "2011-10-19T16:40:51.620Z"); +} + class TimeTest : public testing::TestWithParam< std::tuple> {};