From d7dd1de647ee186d2161b2c464bdb8bb68f085fb Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Mon, 2 Nov 2026 11:07:42 +0100 Subject: [PATCH] Reject '+' sign in page selection numbers (#5715) Found while testing crates/ui-egui/src/panels/page_selection_ui.rs:24-27 (parse, `number` closure) Co-authored-by: Claude Haiku 5.5 --- crates/ui-egui/src/panels/page_selection_ui.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/crates/ui-egui/src/panels/page_selection_ui.rs b/crates/ui-egui/src/panels/page_selection_ui.rs index eb97b16b09..deb811768e 100644 --- a/crates/ui-egui/src/panels/page_selection_ui.rs +++ b/crates/ui-egui/src/panels/page_selection_ui.rs @@ -22,7 +22,9 @@ pub(crate) fn parse(text: &str, count: usize) -> Result, PrintError> let mut pages = BTreeSet::new(); let mut budget = 1_000_000usize; let number = |token: &str| { - let n = token.trim().parse::().map_err(|_| PrintError::NotAPage(token.into()))?; + let t = token.trim(); + let n = + if t.bytes().all(|b| b.is_ascii_digit()) { t.parse::().ok() } else { None }.ok_or_else(|| PrintError::NotAPage(token.into()))?; if n == 0 || n > count { Err(PrintError::OutOfRange(n, count)) } else { Ok(n - 1) } }; for part in text.split([',', ';']).map(str::trim) { @@ -132,6 +134,13 @@ impl PageSelectionInput { mod tests { use super::*; + #[test] + fn plus_sign_is_not_a_page_number() { + for text in ["+3", "+2-4", "2-+4"] { + assert!(matches!(parse(text, 100), Err(PrintError::NotAPage(_))), "{text}"); + } + } + #[test] fn selection_ranges_are_sorted_unique_and_bounded() { let pages = parse("1,12,16-18,89,92,93,97,99", 100).unwrap();