From d6da646d879a1b7f0ea2d09db2b266e3b6d0f3fa Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Wed, 29 Dec 2021 22:15:04 -0500 Subject: validate iso8601 when parsing to snowflake --- src/discord/snowflake.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/discord/snowflake.cpp') diff --git a/src/discord/snowflake.cpp b/src/discord/snowflake.cpp index 32f9f4f..8f470a7 100644 --- a/src/discord/snowflake.cpp +++ b/src/discord/snowflake.cpp @@ -42,9 +42,11 @@ Snowflake Snowflake::FromNow() { Snowflake Snowflake::FromISO8601(std::string_view ts) { int yr, mon, day, hr, min, sec, tzhr, tzmin; float milli; - std::sscanf(ts.data(), "%d-%d-%dT%d:%d:%d%f+%d:%d", - &yr, &mon, &day, &hr, &min, &sec, &milli, &tzhr, &tzmin); - return SecondsInterval * (util::TimeToEpoch(yr, mon, day, hr, min, sec) - DiscordEpochSeconds) + static_cast(milli * static_cast(SecondsInterval)); + if (std::sscanf(ts.data(), "%d-%d-%dT%d:%d:%d%f+%d:%d", + &yr, &mon, &day, &hr, &min, &sec, &milli, &tzhr, &tzmin) != 9) return Snowflake::Invalid; + const auto epoch = util::TimeToEpoch(yr, mon, day, hr, min, sec); + if (epoch < DiscordEpochSeconds) return Snowflake::Invalid; + return SecondsInterval * (epoch - DiscordEpochSeconds) + static_cast(milli * static_cast(SecondsInterval)); } bool Snowflake::IsValid() const { -- cgit v1.2.3