From 4d5c034eb10d0a07098abb75ddd5771b6d444c05 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 29 Nov 2023 14:11:43 +0100 Subject: [PATCH] Run the echo fuzzer in the CI --- .github/workflows/fuzzing.yml | 1 + fuzz/fuzz_targets/fuzz_echo.rs | 21 ++++++++------------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/.github/workflows/fuzzing.yml b/.github/workflows/fuzzing.yml index 2274f6905c..cc1547c87a 100644 --- a/.github/workflows/fuzzing.yml +++ b/.github/workflows/fuzzing.yml @@ -42,6 +42,7 @@ jobs: - { name: fuzz_date, should_pass: false } - { name: fuzz_expr, should_pass: true } - { name: fuzz_printf, should_pass: false } + - { name: fuzz_echo, should_pass: false } - { name: fuzz_parse_glob, should_pass: true } - { name: fuzz_parse_size, should_pass: true } - { name: fuzz_parse_time, should_pass: true } diff --git a/fuzz/fuzz_targets/fuzz_echo.rs b/fuzz/fuzz_targets/fuzz_echo.rs index 3d81008530..826fd6da3e 100644 --- a/fuzz/fuzz_targets/fuzz_echo.rs +++ b/fuzz/fuzz_targets/fuzz_echo.rs @@ -1,6 +1,6 @@ #![no_main] use libfuzzer_sys::fuzz_target; -use uu_echo::uumain; // Changed from uu_printf to uu_echo +use uu_echo::uumain; use rand::prelude::SliceRandom; use rand::Rng; @@ -12,7 +12,7 @@ use crate::fuzz_common::{ compare_result, generate_and_run_uumain, generate_random_string, run_gnu_cmd, }; -static CMD_PATH: &str = "/usr/bin/echo"; // Changed from "printf" to "echo" +static CMD_PATH: &str = "echo"; fn generate_echo() -> String { let mut rng = rand::thread_rng(); @@ -22,7 +22,6 @@ fn generate_echo() -> String { let include_n = rng.gen_bool(0.1); // 10% chance let include_e = rng.gen_bool(0.1); // 10% chance let include_E = rng.gen_bool(0.1); // 10% chance - // --help and --version are typically not included in fuzzing as they don't change output format if include_n { echo_str.push_str("-n "); @@ -41,29 +40,25 @@ fn generate_echo() -> String { if include_e { // Add a 10% chance of including an escape sequence if rng.gen_bool(0.1) { - echo_str.push_str(&generate_escape_sequence(&mut rng)); // This function should handle echo-specific sequences + echo_str.push_str(&generate_escape_sequence(&mut rng)); } } echo_str } -// You should also modify the generate_escape_sequence function to include echo-specific sequences fn generate_escape_sequence(rng: &mut impl Rng) -> String { let escape_sequences = [ - "\\\\", "\\a", "\\b", "\\c", "\\e", "\\f", "\\n", "\\r", "\\t", "\\v", - "\\0NNN", // You can randomly generate NNN - "\\xHH", // You can randomly generate HH - // ... other sequences + "\\\\", "\\a", "\\b", "\\c", "\\e", "\\f", "\\n", "\\r", "\\t", "\\v", "\\0NNN", "\\xHH", ]; escape_sequences.choose(rng).unwrap().to_string() } fuzz_target!(|_data: &[u8]| { - let echo_input = generate_echo(); // Changed from generate_printf to generate_echo - let mut args = vec![OsString::from("echo")]; // Changed from "printf" to "echo" + let echo_input = generate_echo(); + let mut args = vec![OsString::from("echo")]; args.extend(echo_input.split_whitespace().map(OsString::from)); - let rust_result = generate_and_run_uumain(&args, uumain); // uumain function from uu_echo + let rust_result = generate_and_run_uumain(&args, uumain); let gnu_result = match run_gnu_cmd(CMD_PATH, &args[1..], false) { Ok(result) => result, @@ -88,6 +83,6 @@ fuzz_target!(|_data: &[u8]| { &gnu_result.stderr, rust_result.exit_code, gnu_result.exit_code, - false, // Set to true if you want to fail on stderr diff + true, ); });