X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=fuzz%2Fsrc%2Fbin%2Fmsg_onion_hop_data_target.rs;h=75a5c19c2715cb0745be4c81c91d92caabb73373;hb=2e997d758fc6669df8a5a9ecd7a9a82943a2b8f1;hp=95453bc954a05873e6fe6e1b9c8d28d4d73e63a5;hpb=2ec7c7703698b55942a7d0d1b23d83e3881d557f;p=rust-lightning diff --git a/fuzz/src/bin/msg_onion_hop_data_target.rs b/fuzz/src/bin/msg_onion_hop_data_target.rs index 95453bc9..75a5c19c 100644 --- a/fuzz/src/bin/msg_onion_hop_data_target.rs +++ b/fuzz/src/bin/msg_onion_hop_data_target.rs @@ -6,9 +6,6 @@ extern crate lightning_fuzz; use lightning_fuzz::msg_targets::msg_onion_hop_data::*; -use std::fs; -use std::io::Read; - #[cfg(feature = "afl")] #[macro_use] extern crate afl; #[cfg(feature = "afl")] @@ -38,6 +35,8 @@ fuzz_target!(|data: &[u8]| { #[cfg(feature = "stdin_fuzz")] fn main() { + use std::io::Read; + let mut data = Vec::with_capacity(8192); std::io::stdin().read_to_end(&mut data).unwrap(); msg_onion_hop_data_run(data.as_ptr(), data.len()); @@ -45,15 +44,50 @@ fn main() { #[test] fn run_test_cases() { - let mut data: Vec = vec![0]; - msg_onion_hop_data_run(data.as_ptr(), data.len()); + use std::fs; + use std::io::Read; + use lightning_fuzz::utils::test_logger::StringBuffer; + + use std::sync::{atomic, Arc}; + { + let data: Vec = vec![0]; + msg_onion_hop_data_run(data.as_ptr(), data.len()); + } + let mut threads = Vec::new(); + let threads_running = Arc::new(atomic::AtomicUsize::new(0)); if let Ok(tests) = fs::read_dir("test_cases/msg_onion_hop_data") { for test in tests { - data.clear(); + let mut data: Vec = Vec::new(); let path = test.unwrap().path(); - println!("Running test {}...", path.file_name().unwrap().to_str().unwrap()); - fs::File::open(path).unwrap().read_to_end(&mut data).unwrap(); - msg_onion_hop_data_run(data.as_ptr(), data.len()); + fs::File::open(&path).unwrap().read_to_end(&mut data).unwrap(); + threads_running.fetch_add(1, atomic::Ordering::AcqRel); + + let thread_count_ref = Arc::clone(&threads_running); + let main_thread_ref = std::thread::current(); + threads.push((path.file_name().unwrap().to_str().unwrap().to_string(), + std::thread::spawn(move || { + let string_logger = StringBuffer::new(); + + let panic_logger = string_logger.clone(); + let res = if ::std::panic::catch_unwind(move || { + msg_onion_hop_data_test(&data, panic_logger); + }).is_err() { + Some(string_logger.into_string()) + } else { None }; + thread_count_ref.fetch_sub(1, atomic::Ordering::AcqRel); + main_thread_ref.unpark(); + res + }) + )); + while threads_running.load(atomic::Ordering::Acquire) > 32 { + std::thread::park(); + } + } + } + for (test, thread) in threads.drain(..) { + if let Some(output) = thread.join().unwrap() { + println!("Output of {}:\n{}", test, output); + panic!(); } } }