diff --git a/fuzz/fuzz_targets/fuzz_date.rs b/fuzz/fuzz_targets/fuzz_date.rs index 0f9cb262c..a52788a6c 100644 --- a/fuzz/fuzz_targets/fuzz_date.rs +++ b/fuzz/fuzz_targets/fuzz_date.rs @@ -3,12 +3,24 @@ use libfuzzer_sys::fuzz_target; use std::ffi::OsString; use uu_date::uumain; +use uufuzz::generate_and_run_uumain; fuzz_target!(|data: &[u8]| { let delim: u8 = 0; // Null byte - let args = data + let args: Vec = data .split(|b| *b == delim) .filter_map(|e| std::str::from_utf8(e).ok()) - .map(OsString::from); - uumain(args); + .map(OsString::from) + .collect(); + + // Ensure we have at least a program name + if args.is_empty() { + return; + } + + let date_main = |args: std::vec::IntoIter| -> i32 { + uumain(args) + }; + + let _ = generate_and_run_uumain(&args, date_main, None); }); diff --git a/tests/by-util/test_date.rs b/tests/by-util/test_date.rs index bd1c31cc1..a8c353b3f 100644 --- a/tests/by-util/test_date.rs +++ b/tests/by-util/test_date.rs @@ -17,6 +17,13 @@ fn test_invalid_arg() { new_ucmd!().arg("--definitely-invalid").fails_with_code(1); } +#[test] +fn test_empty_arguments() { + new_ucmd!().arg("").fails_with_code(1); + new_ucmd!().args(&["", ""]).fails_with_code(1); + new_ucmd!().args(&["", "", ""]).fails_with_code(1); +} + #[test] fn test_date_email() { for param in ["--rfc-email", "--rfc-e", "-R", "--rfc-2822", "--rfc-822"] {