From 7e92c28b23c759c3f76fed7e677845ba3fb7551f Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Sat, 31 Oct 2026 08:05:02 +0000 Subject: [PATCH] Reject shutter fractions with a non-positive numerator or denominator Found while testing crates/catalog/src/model.rs:160 (parse_shutter_seconds) Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/catalog/src/model.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/crates/catalog/src/model.rs b/crates/catalog/src/model.rs index eebc9b3e4..ed1c190c5 100644 --- a/crates/catalog/src/model.rs +++ b/crates/catalog/src/model.rs @@ -157,7 +157,10 @@ impl CopyrightStatus { pub fn parse_shutter_seconds(s: &str) -> Option { let s = s.trim().trim_end_matches(['s', '"']).trim(); match s.split_once('/') { - Some((n, d)) => Some(n.trim().parse::().ok()? / d.trim().parse::().ok()?), + Some((n, d)) => { + let (n, d) = (n.trim().parse::().ok()?, d.trim().parse::().ok()?); + if n > 0.0 && d > 0.0 { Some(n / d) } else { None } + } None => s.parse().ok(), } .filter(|v: &f64| v.is_finite() && *v > 0.0) @@ -716,3 +719,16 @@ mod edited_tests { } } } + +#[cfg(test)] +mod shutter_tests { + use super::parse_shutter_seconds; + + #[test] + fn a_fraction_needs_a_positive_numerator_and_denominator() { + for s in ["-1/-250", "1/-250", "-1/250", "0/250"] { + assert_eq!(parse_shutter_seconds(s), None, "{s}"); + } + assert_eq!(parse_shutter_seconds("1/250"), Some(0.004)); + } +}