fix: validate parse_date calendar dates with chrono

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
NetterSilver
2026-11-02 14:36:06 +07:00
committed by bflatastic
co-authored by Claude Sonnet 5.5
parent 83ed70acce
commit 88d8a7839e
3 changed files with 4 additions and 9 deletions
Generated
+1
View File
@@ -6228,6 +6228,7 @@ name = "vectorcraft-engine"
version = "0.20.0"
dependencies = [
"cfb",
"chrono",
"craft-docpath",
"crc32fast",
"flate2",
+1
View File
@@ -38,6 +38,7 @@ vectorcraft-scriptcheck = { workspace = true }
image = { workspace = true }
hayro-jpeg2000 = { version = "=0.3.5", default-features = false, features = ["std", "simd"] }
flate2 = { workspace = true }
chrono = { workspace = true }
# The XML parts of Word documents placed as type (place/docx.rs).
roxmltree = "0.21"
# The compound file that holds a Word 97-2003 document placed as type (place/doc.rs).
+2 -9
View File
@@ -111,15 +111,8 @@ pub fn parse_date(s: &str) -> Option<[i64; 6]> {
}
let num = |a: usize, b: usize| digits.get(a..b).and_then(|t| t.parse::<i64>().ok());
let (y, m, d) = (num(0, 4)?, num(4, 6)?, num(6, 8)?);
let leap = (y % 4 == 0 && y % 100 != 0) || y % 400 == 0;
let days = match m {
1 | 3 | 5 | 7 | 8 | 10 | 12 => 31,
4 | 6 | 9 | 11 => 30,
2 if leap => 29,
2 => 28,
_ => return None,
};
(1..=days).contains(&d).then_some([y, m, d, 0, 0, 0])
chrono::NaiveDate::from_ymd_opt(i32::try_from(y).ok()?, u32::try_from(m).ok()?, u32::try_from(d).ok()?)?;
Some([y, m, d, 0, 0, 0])
}
#[cfg(test)]