From fb5b5f4849273fe4279e2c5a2e7bb8a47ed2dc9d Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 2 Nov 2025 23:16:55 +0100 Subject: [PATCH] date: improve the date fuzzer --- fuzz/fuzz_targets/fuzz_date.rs | 36 +++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/fuzz/fuzz_targets/fuzz_date.rs b/fuzz/fuzz_targets/fuzz_date.rs index a52788a6c..16a792105 100644 --- a/fuzz/fuzz_targets/fuzz_date.rs +++ b/fuzz/fuzz_targets/fuzz_date.rs @@ -7,20 +7,34 @@ use uufuzz::generate_and_run_uumain; fuzz_target!(|data: &[u8]| { let delim: u8 = 0; // Null byte - let args: Vec = data + let fuzz_args: Vec = data .split(|b| *b == delim) .filter_map(|e| std::str::from_utf8(e).ok()) .map(OsString::from) .collect(); - - // Ensure we have at least a program name - if args.is_empty() { - return; + + // Skip test cases that would cause the program to read from stdin + // These would hang the fuzzer waiting for input + for i in 0..fuzz_args.len() { + if let Some(arg) = fuzz_args.get(i) { + let arg_str = arg.to_string_lossy(); + // Skip if -f- or --file=- (reads dates from stdin) + if (arg_str == "-f" + && fuzz_args + .get(i + 1) + .map(|a| a.to_string_lossy() == "-") + .unwrap_or(false)) + || arg_str == "-f-" + || arg_str == "--file=-" + { + return; + } + } } - - let date_main = |args: std::vec::IntoIter| -> i32 { - uumain(args) - }; - - let _ = generate_and_run_uumain(&args, date_main, None); + + // Add program name as first argument (required for proper argument parsing) + let mut args = vec![OsString::from("date")]; + args.extend(fuzz_args); + + let _ = generate_and_run_uumain(&args, uumain, None); });