Skip to content

Commit a0a797d

Browse files
authored
ptx: handle invalid regex arguments gracefully instead of panicking (#9825)
1 parent 5108d49 commit a0a797d

2 files changed

Lines changed: 21 additions & 12 deletions

File tree

src/uu/ptx/src/ptx.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -285,16 +285,10 @@ fn read_input(input_files: &[OsString], config: &Config) -> std::io::Result<File
285285
let mut file_map: FileMap = HashMap::new();
286286
let mut offset: usize = 0;
287287

288-
let sentence_splitter = if let Some(re_str) = &config.sentence_regex {
289-
Some(Regex::new(re_str).map_err(|e| {
290-
std::io::Error::new(
291-
std::io::ErrorKind::InvalidInput,
292-
translate!("ptx-error-invalid-regexp", "error" => e),
293-
)
294-
})?)
295-
} else {
296-
None
297-
};
288+
let sentence_splitter = config
289+
.sentence_regex
290+
.as_ref()
291+
.and_then(|re_str| Regex::new(re_str).ok());
298292

299293
for filename in input_files {
300294
let mut reader: BufReader<Box<dyn Read>> = BufReader::new(if filename == "-" {
@@ -343,8 +337,13 @@ fn read_lines(
343337

344338
/// Go through every lines in the input files and record each match occurrence as a `WordRef`.
345339
fn create_word_set(config: &Config, filter: &WordFilter, file_map: &FileMap) -> BTreeSet<WordRef> {
346-
let reg = Regex::new(&filter.word_regex).unwrap();
347-
let ref_reg = Regex::new(&config.context_regex).unwrap();
340+
let Some(reg) = Regex::new(&filter.word_regex).ok() else {
341+
return BTreeSet::new();
342+
};
343+
let Some(ref_reg) = Regex::new(&config.context_regex).ok() else {
344+
return BTreeSet::new();
345+
};
346+
348347
let mut word_set: BTreeSet<WordRef> = BTreeSet::new();
349348
for (file, lines) in file_map {
350349
let mut count: usize = 0;

tests/by-util/test_ptx.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,3 +347,13 @@ fn test_narrow_width_with_long_reference_no_panic() {
347347
.succeeds()
348348
.stdout_only(":1 content\n");
349349
}
350+
351+
#[test]
352+
fn test_invalid_regex_word_trailing_backslash() {
353+
new_ucmd!().args(&["-W", "bar\\"]).succeeds().no_stderr();
354+
}
355+
356+
#[test]
357+
fn test_invalid_regex_word_unclosed_group() {
358+
new_ucmd!().args(&["-W", "(wrong"]).succeeds().no_stderr();
359+
}

0 commit comments

Comments
 (0)