From ddd017eb0a5d0f643462383d46f6f68ad2141fe0 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Wed, 28 Oct 2026 16:06:22 +0100 Subject: [PATCH] Reject a sign after # in EPS PostScript radix numbers Found while testing crates/eps/src/import/lex.rs:287-289 (number) Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/eps/src/import/lex.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/crates/eps/src/import/lex.rs b/crates/eps/src/import/lex.rs index 94f2b541b..57d3e73e2 100644 --- a/crates/eps/src/import/lex.rs +++ b/crates/eps/src/import/lex.rs @@ -286,6 +286,10 @@ fn number(w: &str) -> Option { } if let Some((base, digits)) = w.split_once('#') { let base: u32 = base.parse().ok().filter(|b| (2..=36).contains(b))?; + // `from_str_radix` accepts a leading sign; a PostScript radix number has digits only. + if digits.starts_with(['+', '-']) { + return None; + } return i64::from_str_radix(digits, base).ok().map(Obj::Int); } // Rust reads `inf` and `nan`; PostScript doesn't. @@ -295,3 +299,15 @@ fn number(w: &str) -> Option { let v: f64 = w.parse().ok()?; v.is_finite().then_some(Obj::Real(v)) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn radix_number_with_sign_after_hash_is_not_a_number() { + assert!(number("16#+ff").is_none()); + assert!(number("16#-ff").is_none()); + assert!(matches!(number("16#ff"), Some(Obj::Int(255)))); + } +}