From c714797e99c82215080a3bfb51aadc50dc8c9180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Mittelst=C3=A4dt?= <62167861+TheGalitube@users.noreply.github.com> Date: Wed, 28 Oct 2026 23:40:33 +0000 Subject: [PATCH] Reject fractional DXF integer values Found while testing crates/cad/src/import/reader.rs:69 Co-Authored-By: GPT-6-Luna --- crates/cad/src/import/reader.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/cad/src/import/reader.rs b/crates/cad/src/import/reader.rs index 8733c96c8..0da950ead 100644 --- a/crates/cad/src/import/reader.rs +++ b/crates/cad/src/import/reader.rs @@ -66,7 +66,7 @@ pub(crate) fn number(s: &str) -> Option { /// A whole number; some writers put integers as `1.0`. pub(crate) fn integer(s: &str) -> Option { let s = s.trim(); - s.parse::().ok().or_else(|| number(s).filter(|v| v.abs() < 9.0e15).map(|v| v as i64)) + s.parse::().ok().or_else(|| number(s).filter(|v| v.abs() < 9.0e15 && v.fract() == 0.0).map(|v| v as i64)) } /// One object: its type (the value of its `0` group) and the groups up to the next object. @@ -456,3 +456,14 @@ fn layouts(objects: &[Record<'_>], block_records: &HashMap, enti } std::iter::once(LayoutDef { name: MODEL.into(), block: None }).chain(paper.into_iter().map(|(_, l)| l)).collect() } + +#[cfg(test)] +mod tests { + use super::integer; + + #[test] + fn integer_rejects_fractional_float_values() { + assert_eq!(integer("1.0"), Some(1)); + assert_eq!(integer("1.9"), None); + } +}