From ef24de24a82fe681581cc130f342363c47c0969a Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 7 Jun 2024 07:48:48 +0200 Subject: Merging upstream version 1.75.0+dfsg1. Signed-off-by: Daniel Baumann --- vendor/toml_datetime/src/datetime.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'vendor/toml_datetime/src/datetime.rs') diff --git a/vendor/toml_datetime/src/datetime.rs b/vendor/toml_datetime/src/datetime.rs index 15781b915..1b37c7009 100644 --- a/vendor/toml_datetime/src/datetime.rs +++ b/vendor/toml_datetime/src/datetime.rs @@ -308,7 +308,15 @@ impl FromStr for Datetime { if date.month < 1 || date.month > 12 { return Err(DatetimeParseError {}); } - if date.day < 1 || date.day > 31 { + let is_leap_year = + (date.year % 4 == 0) && ((date.year % 100 != 0) || (date.year % 400 == 0)); + let max_days_in_month = match date.month { + 2 if is_leap_year => 29, + 2 => 28, + 4 | 6 | 9 | 11 => 30, + _ => 31, + }; + if date.day < 1 || date.day > max_days_in_month { return Err(DatetimeParseError {}); } @@ -381,7 +389,8 @@ impl FromStr for Datetime { if time.minute > 59 { return Err(DatetimeParseError {}); } - if time.second > 59 { + // 00-58, 00-59, 00-60 based on leap second rules + if time.second > 60 { return Err(DatetimeParseError {}); } if time.nanosecond > 999_999_999 { @@ -451,7 +460,7 @@ impl FromStr for Datetime { fn digit(chars: &mut str::Chars<'_>) -> Result { match chars.next() { - Some(c) if ('0'..='9').contains(&c) => Ok(c as u8 - b'0'), + Some(c) if c.is_ascii_digit() => Ok(c as u8 - b'0'), _ => Err(DatetimeParseError {}), } } -- cgit v1.2.3