From 12a2ca31bc121179260ec42b9326a9e53bd1eba9 Mon Sep 17 00:00:00 2001 From: Anton Kolesnyk <41349689+antkmsft@users.noreply.github.com> Date: Mon, 13 Dec 2021 12:55:00 -0800 Subject: [PATCH] Fix DateTime::Parse validation for dates past year 9999 due to adjustments (#3177) --- sdk/core/azure-core/CHANGELOG.md | 2 ++ sdk/core/azure-core/src/datetime.cpp | 2 +- sdk/core/azure-core/test/ut/datetime_test.cpp | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/sdk/core/azure-core/CHANGELOG.md b/sdk/core/azure-core/CHANGELOG.md index 0925fa542..889a59f78 100644 --- a/sdk/core/azure-core/CHANGELOG.md +++ b/sdk/core/azure-core/CHANGELOG.md @@ -10,6 +10,8 @@ ### Bugs Fixed +- Fixed `Azure::DateTime::Parse()` validation if the result is going to exceed `9999-12-31T23:59:59.9999999` due to time zone, leap second, or fractional digits rounding up adjustments. + ### Other Changes ## 1.3.1 (2021-11-05) diff --git a/sdk/core/azure-core/src/datetime.cpp b/sdk/core/azure-core/src/datetime.cpp index 58deaa7d4..4bfca2415 100644 --- a/sdk/core/azure-core/src/datetime.cpp +++ b/sdk/core/azure-core/src/datetime.cpp @@ -236,7 +236,7 @@ void ValidateDate( + (hour * OneHourIn100ns) + (minute * OneMinuteIn100ns) + (second * OneSecondIn100ns) + fracSec + (roundFracSecUp ? 1 : 0); - constexpr auto FracSecTo9999_12_31_23_59_59_9999999 = (31 * OneDayIn100ns) + constexpr auto FracSecTo9999_12_31_23_59_59_9999999 = (30 * OneDayIn100ns) + (23 * OneHourIn100ns) + (59 * OneMinuteIn100ns) + (59 * OneSecondIn100ns) + 9999999; if (fracSecSince9999_12_01 - fracSecTimeAdjustment > FracSecTo9999_12_31_23_59_59_9999999) diff --git a/sdk/core/azure-core/test/ut/datetime_test.cpp b/sdk/core/azure-core/test/ut/datetime_test.cpp index c577efee9..a962f52f8 100644 --- a/sdk/core/azure-core/test/ut/datetime_test.cpp +++ b/sdk/core/azure-core/test/ut/datetime_test.cpp @@ -802,3 +802,20 @@ TEST(DateTime, TimeRoundtrip) TestDateTimeRoundtrip("2021-02-05T10:00:00.0000000Z"); TestDateTimeRoundtrip("2021-02-05T20:00:00.0000000Z"); } + +TEST(DateTime, ParseRoundUpInvalidDate) +{ + EXPECT_THROW( + static_cast( + DateTime::Parse("9999-12-31T23:59:00-00:01", DateTime::DateFormat::Rfc3339)), + std::invalid_argument); + + EXPECT_THROW( + static_cast( + DateTime::Parse("9999-12-31T23:59:59.99999995", DateTime::DateFormat::Rfc3339)), + std::invalid_argument); + + EXPECT_THROW( + static_cast(DateTime::Parse("9999-12-31T23:59:60", DateTime::DateFormat::Rfc3339)), + std::invalid_argument); +}