Reject '+' sign in print page ranges (#4931)

This commit is contained in:
NetterSilver authored and GitHub committed 2026-11-09 10:10:10 +08:00
1 parent ebcc564f1e
commit 51655eab0c
1 file changed
+11
+11
View File
@@ -51,6 +51,10 @@ fn page_of(tok: &str, count: usize, labels: &Labels) -> Result<usize, PrintError
if let Some(i) = labels.get(t) {
return Ok(i);
}
// `usize::from_str` accepts a leading '+', which is not part of a page number.
if !t.bytes().all(|b| b.is_ascii_digit()) {
return Err(PrintError::NotAPage(t.to_string()));
}
match t.parse::<usize>() {
Ok(n) if n >= 1 && n <= count => Ok(n - 1),
Ok(n) => Err(PrintError::OutOfRange(n, count)),
@@ -176,6 +180,13 @@ mod tests {
assert!(select_pages(0, Some("-"), &[], Subset::All, false).is_err());
}
#[test]
fn plus_sign_is_not_a_page() {
for r in ["+3", "+2-4", "2-+4"] {
assert!(matches!(select_pages(5, Some(r), &[], Subset::All, false), Err(PrintError::NotAPage(_))), "accepted {r}");
}
}
#[test]
fn open_ended_range_covers_all_pages() {
assert_eq!(select_pages(5, Some("-"), &[], Subset::All, false).unwrap(), vec![0, 1, 2, 3, 4]);