diff --git a/fuzz/atom/parser/fuzz.rs b/fuzz/atom/parser/fuzz.rs index 83d5787..b727c24 100644 --- a/fuzz/atom/parser/fuzz.rs +++ b/fuzz/atom/parser/fuzz.rs @@ -4,25 +4,12 @@ use core::slice; use gentoo_utils::{Parseable, atom::Atom}; use std::{ + env::{self}, io::{self, Write}, - sync::{LazyLock, Mutex}, }; -#[derive(Debug)] -struct State { - input: io::Stdin, - output: io::Stdout, -} - #[unsafe(no_mangle)] pub unsafe extern "C" fn LLVMFuzzerTestOneInput(input: *const u8, len: usize) -> i32 { - static PIPES: LazyLock> = LazyLock::new(|| { - Mutex::new(State { - input: io::stdin(), - output: io::stdout(), - }) - }); - let slice = unsafe { slice::from_raw_parts(input, len) }; let str = str::from_utf8(slice).expect("expected ascii input"); @@ -30,13 +17,13 @@ pub unsafe extern "C" fn LLVMFuzzerTestOneInput(input: *const u8, len: usize) -> return -1; } - let mut state = PIPES.lock().unwrap(); - - writeln!(&mut state.output, "{str}").unwrap(); - + let stdin = io::stdin(); + let mut stdout = io::stdout(); let mut buffer = String::new(); - state.input.read_line(&mut buffer).unwrap(); + writeln!(&mut stdout, "{str}").unwrap(); + + stdin.read_line(&mut buffer).unwrap(); let control = match buffer.as_str().trim() { "0" => Ok(()), @@ -48,23 +35,32 @@ pub unsafe extern "C" fn LLVMFuzzerTestOneInput(input: *const u8, len: usize) -> match (control, gentoo_utils) { (Ok(_), Ok(_)) => { - eprintln!("agreement that {str} is valid"); + if env::var("FUZZER_LOG").is_ok() { + eprintln!("agreement that {str} is valid"); + } } (Err(_), Err(_)) => { - eprintln!("agreement that {str} is invalid"); + if env::var("FUZZER_LOG").is_ok() { + eprintln!("agreement that {str} is invalid"); + } } (Ok(_), Err(rest)) => { panic!("disagreement on {str}\ncontrol:Ok\ngentoo-utils:Err({rest})"); } (Err(_), Ok(atom)) - if atom - .usedeps() - .iter() - .any(|usedep| atom.usedeps().iter().filter(|u| usedep == *u).count() > 1) => + if atom.usedeps().iter().any(|usedep| { + atom.usedeps() + .iter() + .filter(|u| *usedep.flag() == *u.flag()) + .count() + > 1 + }) => { - eprintln!( - "disagreement, but we will allow it since its probably because of duplicated usdeps" - ); + if env::var("FUZZER_LOG").is_ok() { + eprintln!( + "disagreement, but we will allow it since its probably because of duplicated usdeps" + ); + } } (Err(_), Ok(_)) => { panic!("disagreement on {str}\ncontrol:Err\ngentoo-utils:Ok") diff --git a/scripts/atom.py b/scripts/atom.py index 2e8ca7f..a93251a 100755 --- a/scripts/atom.py +++ b/scripts/atom.py @@ -2,12 +2,13 @@ import sys from portage.dep import Atom +from portage.exception import InvalidAtom for line in sys.stdin.buffer: try: Atom(line.decode().strip()) sys.stdout.buffer.write(b"0\n") - except: + except InvalidAtom: sys.stdout.buffer.write(b"1\n") finally: sys.stdout.buffer.flush()