From 3243271d4eea800a02cf532b202d833429dc631c Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Fri, 30 Oct 2026 02:31:09 +0100 Subject: [PATCH] Reject zero distance in JSON offset command (#2190) Found while testing crates/engine/src/cmd/modify.rs:791 (run_offset) Co-authored-by: Claude Haiku 5.5 Co-authored-by: Brandon Thomas --- crates/engine/src/cmd/modify/offset.rs | 3 +++ crates/engine/src/tests.rs | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/crates/engine/src/cmd/modify/offset.rs b/crates/engine/src/cmd/modify/offset.rs index 01ca46c04..20e6ba58e 100644 --- a/crates/engine/src/cmd/modify/offset.rs +++ b/crates/engine/src/cmd/modify/offset.rs @@ -197,6 +197,9 @@ fn join_point(a: &Segment, b: &Segment) -> Option { pub(super) fn run_offset(s: &mut Session, p: &Value) -> Result { let h = targets(s, p)?.first().copied().ok_or_else(|| bad("offset", "`handle` is required"))?; let dist = f64_req("offset", p, "distance")?; + if dist == 0.0 { + return Err(bad("offset", "Requires a positive distance.")); + } let side = point_req("offset", p, "side")?; let e = s.doc()?.entity(h).map(|e| (**e).clone()).ok_or_else(|| bad("offset", "no such object"))?; let k = offset_kind(&e.kind, dist.abs(), side).ok_or_else(|| bad("offset", "cannot offset that object"))?; diff --git a/crates/engine/src/tests.rs b/crates/engine/src/tests.rs index b06641fbb..be6246824 100644 --- a/crates/engine/src/tests.rs +++ b/crates/engine/src/tests.rs @@ -344,6 +344,15 @@ fn fillet_two_lines() { assert!(g.iter().any(|p| p.near(Vec2::new(2.0, 0.0), 1e-9))); } +#[test] +fn offset_zero_distance_is_rejected() { + let mut s = Session::new(); + s.execute("line", &json!({"points": [[0, 0], [10, 0]]})).unwrap(); + let r = s.execute("offset", &json!({"handle": "100", "distance": 0, "side": [1, 1]})); + assert!(r.is_err(), "offset distance 0 made a coincident copy: {r:?}"); + assert_eq!(s.doc().unwrap().model.len(), 1); +} + #[test] fn offset_circle_and_polyline() { let mut s = Session::new();