From dfc4027ee24b83e997fc34877f6d39a67c40ceb6 Mon Sep 17 00:00:00 2001 From: Micha White Date: Thu, 5 May 2022 15:51:04 -0400 Subject: [PATCH] Check for overflow when parsing datetime --- src/datetime/tests.rs | 1 + src/format/parsed.rs | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/datetime/tests.rs b/src/datetime/tests.rs index 8c373d3ba3..9623b286ff 100644 --- a/src/datetime/tests.rs +++ b/src/datetime/tests.rs @@ -130,6 +130,7 @@ fn test_datetime_rfc2822_and_rfc3339() { DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567+05:00"), Ok(edt.ymd(2015, 2, 18).and_hms_micro(23, 59, 59, 1_234_567)) ); + assert!(DateTime::parse_from_rfc2822("31 DEC 262143 23:59 -2359").is_err()); } #[test] diff --git a/src/format/parsed.rs b/src/format/parsed.rs index 011ad889aa..4665fcaf7c 100644 --- a/src/format/parsed.rs +++ b/src/format/parsed.rs @@ -626,6 +626,12 @@ impl Parsed { let offset = self.offset.ok_or(NOT_ENOUGH)?; let datetime = self.to_naive_datetime_with_offset(offset)?; let offset = FixedOffset::east_opt(offset).ok_or(OUT_OF_RANGE)?; + + // this is used to prevent an overflow when calling FixedOffset::from_local_datetime + datetime + .checked_sub_signed(OldDuration::seconds(i64::from(offset.local_minus_utc()))) + .ok_or(OUT_OF_RANGE)?; + match offset.from_local_datetime(&datetime) { LocalResult::None => Err(IMPOSSIBLE), LocalResult::Single(t) => Ok(t),