Skip to content

Commit 9bea8a3

Browse files
committed
ptx: handle invalid regex arguments gracefully instead of panicking
1 parent cc103ec commit 9bea8a3

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

src/uu/ptx/src/ptx.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use clap::{Arg, ArgAction, Command};
1919
use regex::Regex;
2020
use thiserror::Error;
2121
use uucore::display::Quotable;
22-
use uucore::error::{FromIo, UError, UResult, UUsageError};
22+
use uucore::error::{FromIo, UError, UResult, USimpleError, UUsageError};
2323
use uucore::format_usage;
2424
use uucore::translate;
2525

@@ -301,9 +301,15 @@ fn read_input(input_files: &[OsString]) -> std::io::Result<FileMap> {
301301
}
302302

303303
/// Go through every lines in the input files and record each match occurrence as a `WordRef`.
304-
fn create_word_set(config: &Config, filter: &WordFilter, file_map: &FileMap) -> BTreeSet<WordRef> {
305-
let reg = Regex::new(&filter.word_regex).unwrap();
306-
let ref_reg = Regex::new(&config.context_regex).unwrap();
304+
fn create_word_set(
305+
config: &Config,
306+
filter: &WordFilter,
307+
file_map: &FileMap,
308+
) -> UResult<BTreeSet<WordRef>> {
309+
let reg = Regex::new(&filter.word_regex)
310+
.map_err(|e| USimpleError::new(1, format!("invalid regular expression: {}", e)))?;
311+
let ref_reg = Regex::new(&config.context_regex)
312+
.map_err(|e| USimpleError::new(1, format!("invalid regular expression: {}", e)))?;
307313
let mut word_set: BTreeSet<WordRef> = BTreeSet::new();
308314
for (file, lines) in file_map {
309315
let mut count: usize = 0;
@@ -342,7 +348,7 @@ fn create_word_set(config: &Config, filter: &WordFilter, file_map: &FileMap) ->
342348
count += 1;
343349
}
344350
}
345-
word_set
351+
Ok(word_set)
346352
}
347353

348354
fn get_reference(config: &Config, word_ref: &WordRef, line: &str, context_reg: &Regex) -> String {
@@ -884,7 +890,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
884890

885891
let word_filter = WordFilter::new(&matches, &config)?;
886892
let file_map = read_input(&input_files).map_err_context(String::new)?;
887-
let word_set = create_word_set(&config, &word_filter, &file_map);
893+
let word_set = create_word_set(&config, &word_filter, &file_map)?;
888894
write_traditional_output(&mut config, &file_map, &word_set, &output_file)
889895
}
890896

tests/by-util/test_ptx.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,3 +301,19 @@ fn test_unicode_truncation_alignment() {
301301
.succeeds()
302302
.stdout_only(" / bar\n föö/\n");
303303
}
304+
305+
#[test]
306+
fn test_invalid_regex_word_trailing_backslash() {
307+
new_ucmd!()
308+
.args(&["-W", "bar\\"])
309+
.fails_with_code(1)
310+
.stderr_contains("ptx: invalid regular expression");
311+
}
312+
313+
#[test]
314+
fn test_invalid_regex_word_unclosed_group() {
315+
new_ucmd!()
316+
.args(&["-W", "(wrong"])
317+
.fails_with_code(1)
318+
.stderr_contains("ptx: invalid regular expression");
319+
}

0 commit comments

Comments
 (0)