From 7439050d85f674a1886c4dc497fade20a9d794a7 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 28 May 2025 15:53:54 +0200 Subject: [PATCH 1/2] csplit: only allow ASCII digits for repeat pattern --- src/uu/csplit/src/patterns.rs | 2 +- tests/by-util/test_csplit.rs | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/uu/csplit/src/patterns.rs b/src/uu/csplit/src/patterns.rs index bdf15b511..b49d1c606 100644 --- a/src/uu/csplit/src/patterns.rs +++ b/src/uu/csplit/src/patterns.rs @@ -107,7 +107,7 @@ fn extract_patterns(args: &[String]) -> Result, CsplitError> { let mut patterns = Vec::with_capacity(args.len()); let to_match_reg = Regex::new(r"^(/(?P.+)/|%(?P.+)%)(?P[\+-]?\d+)?$").unwrap(); - let execute_ntimes_reg = Regex::new(r"^\{(?P\d+)|\*\}$").unwrap(); + let execute_ntimes_reg = Regex::new(r"^\{(?P[0-9]+)|\*\}$").unwrap(); let mut iter = args.iter().peekable(); while let Some(arg) = iter.next() { diff --git a/tests/by-util/test_csplit.rs b/tests/by-util/test_csplit.rs index a7a802b92..2a94c10bf 100644 --- a/tests/by-util/test_csplit.rs +++ b/tests/by-util/test_csplit.rs @@ -83,6 +83,15 @@ fn test_up_to_line_sequence() { assert_eq!(at.read("xx02"), generate(25, 51)); } +#[test] +fn test_up_to_line_with_non_ascii_repeat() { + // we use a different error message than GNU + new_ucmd!() + .args(&["numbers50.txt", "10", "{𝟚}"]) + .fails() + .stderr_contains("invalid pattern"); +} + #[test] fn test_up_to_match() { let (at, mut ucmd) = at_and_ucmd!(); From d5b6af5216fd9cdefa9004703ecaa76684181213 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 28 May 2025 16:07:45 +0200 Subject: [PATCH 2/2] csplit: only allow ASCII digits as offset --- src/uu/csplit/src/patterns.rs | 2 +- tests/by-util/test_csplit.rs | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/uu/csplit/src/patterns.rs b/src/uu/csplit/src/patterns.rs index b49d1c606..9326ea379 100644 --- a/src/uu/csplit/src/patterns.rs +++ b/src/uu/csplit/src/patterns.rs @@ -106,7 +106,7 @@ pub fn get_patterns(args: &[String]) -> Result, CsplitError> { fn extract_patterns(args: &[String]) -> Result, CsplitError> { let mut patterns = Vec::with_capacity(args.len()); let to_match_reg = - Regex::new(r"^(/(?P.+)/|%(?P.+)%)(?P[\+-]?\d+)?$").unwrap(); + Regex::new(r"^(/(?P.+)/|%(?P.+)%)(?P[\+-]?[0-9]+)?$").unwrap(); let execute_ntimes_reg = Regex::new(r"^\{(?P[0-9]+)|\*\}$").unwrap(); let mut iter = args.iter().peekable(); diff --git a/tests/by-util/test_csplit.rs b/tests/by-util/test_csplit.rs index 2a94c10bf..96322e444 100644 --- a/tests/by-util/test_csplit.rs +++ b/tests/by-util/test_csplit.rs @@ -176,6 +176,15 @@ fn test_up_to_match_offset_repeat_twice() { assert_eq!(at.read("xx03"), generate(32, 51)); } +#[test] +fn test_up_to_match_non_ascii_offset() { + // we use a different error message than GNU + new_ucmd!() + .args(&["numbers50.txt", "/9$/𝟚"]) + .fails() + .stderr_contains("invalid pattern"); +} + #[test] fn test_up_to_match_negative_offset() { let (at, mut ucmd) = at_and_ucmd!();