From 6664e366e7a62851e66f436b7d346f66a00c4f90 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Sat, 31 Oct 2026 13:03:57 +0100 Subject: [PATCH] Reject repeated '#' in perspective grid colour parser Found while testing crates/tools/src/distort/perspective/define.rs:84-86 (Rgb::parse) Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/tools/src/distort/perspective/define.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/tools/src/distort/perspective/define.rs b/crates/tools/src/distort/perspective/define.rs index a2dd6f424..19600bac4 100644 --- a/crates/tools/src/distort/perspective/define.rs +++ b/crates/tools/src/distort/perspective/define.rs @@ -82,7 +82,8 @@ pub struct Rgb(pub [u8; 3]); impl Rgb { /// `#rrggbb` or `rrggbb`. pub fn parse(s: &str) -> Option { - let h = s.trim().trim_start_matches('#'); + let h = s.trim(); + let h = h.strip_prefix('#').unwrap_or(h); if h.len() != 6 || !h.chars().all(|c| c.is_ascii_hexdigit()) { return None; } @@ -397,6 +398,15 @@ mod tests { const AB: Rect = Rect::new(0.0, 0.0, 800.0, 600.0); + #[test] + fn rgb_rejects_repeated_hash() { + assert!(Rgb::parse("##ff0000").is_none()); + assert!(Rgb::parse("####00ff00").is_none()); + assert!(Rgb::try_from(String::from("##ff0000")).is_err()); + assert_eq!(Rgb::parse("#ff0000"), Some(Rgb([255, 0, 0]))); + assert_eq!(Rgb::parse("ff0000"), Some(Rgb([255, 0, 0]))); + } + #[test] fn the_station_point_places_the_vanishing_points() { let mut g = PerspectiveGrid::normal(2, AB);