| 
 | 1 | +// This file is Copyright its original authors, visible in version control  | 
 | 2 | +// history.  | 
 | 3 | +//  | 
 | 4 | +// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE  | 
 | 5 | +// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license  | 
 | 6 | +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.  | 
 | 7 | +// You may not use this file except in accordance with one or both of these  | 
 | 8 | +// licenses.  | 
 | 9 | + | 
 | 10 | +// This file is auto-generated by gen_target.sh based on target_template.txt  | 
 | 11 | +// To modify it, modify target_template.txt and run gen_target.sh instead.  | 
 | 12 | + | 
 | 13 | +#![cfg_attr(feature = "libfuzzer_fuzz", no_main)]  | 
 | 14 | + | 
 | 15 | +#[cfg(not(fuzzing))]  | 
 | 16 | +compile_error!("Fuzz targets need cfg=fuzzing");  | 
 | 17 | + | 
 | 18 | +extern crate lightning_fuzz;  | 
 | 19 | +use lightning_fuzz::fromstr_to_netaddress::*;  | 
 | 20 | + | 
 | 21 | +#[cfg(feature = "afl")]  | 
 | 22 | +#[macro_use] extern crate afl;  | 
 | 23 | +#[cfg(feature = "afl")]  | 
 | 24 | +fn main() {  | 
 | 25 | +	fuzz!(|data| {  | 
 | 26 | +		fromstr_to_netaddress_run(data.as_ptr(), data.len());  | 
 | 27 | +	});  | 
 | 28 | +}  | 
 | 29 | + | 
 | 30 | +#[cfg(feature = "honggfuzz")]  | 
 | 31 | +#[macro_use] extern crate honggfuzz;  | 
 | 32 | +#[cfg(feature = "honggfuzz")]  | 
 | 33 | +fn main() {  | 
 | 34 | +	loop {  | 
 | 35 | +		fuzz!(|data| {  | 
 | 36 | +			fromstr_to_netaddress_run(data.as_ptr(), data.len());  | 
 | 37 | +		});  | 
 | 38 | +	}  | 
 | 39 | +}  | 
 | 40 | + | 
 | 41 | +#[cfg(feature = "libfuzzer_fuzz")]  | 
 | 42 | +#[macro_use] extern crate libfuzzer_sys;  | 
 | 43 | +#[cfg(feature = "libfuzzer_fuzz")]  | 
 | 44 | +fuzz_target!(|data: &[u8]| {  | 
 | 45 | +	fromstr_to_netaddress_run(data.as_ptr(), data.len());  | 
 | 46 | +});  | 
 | 47 | + | 
 | 48 | +#[cfg(feature = "stdin_fuzz")]  | 
 | 49 | +fn main() {  | 
 | 50 | +	use std::io::Read;  | 
 | 51 | + | 
 | 52 | +	let mut data = Vec::with_capacity(8192);  | 
 | 53 | +	std::io::stdin().read_to_end(&mut data).unwrap();  | 
 | 54 | +	fromstr_to_netaddress_run(data.as_ptr(), data.len());  | 
 | 55 | +}  | 
 | 56 | + | 
 | 57 | +#[test]  | 
 | 58 | +fn run_test_cases() {  | 
 | 59 | +	use std::fs;  | 
 | 60 | +	use std::io::Read;  | 
 | 61 | +	use lightning_fuzz::utils::test_logger::StringBuffer;  | 
 | 62 | + | 
 | 63 | +	use std::sync::{atomic, Arc};  | 
 | 64 | +	{  | 
 | 65 | +		let data: Vec<u8> = vec![0];  | 
 | 66 | +		fromstr_to_netaddress_run(data.as_ptr(), data.len());  | 
 | 67 | +	}  | 
 | 68 | +	let mut threads = Vec::new();  | 
 | 69 | +	let threads_running = Arc::new(atomic::AtomicUsize::new(0));  | 
 | 70 | +	if let Ok(tests) = fs::read_dir("test_cases/fromstr_to_netaddress") {  | 
 | 71 | +		for test in tests {  | 
 | 72 | +			let mut data: Vec<u8> = Vec::new();  | 
 | 73 | +			let path = test.unwrap().path();  | 
 | 74 | +			fs::File::open(&path).unwrap().read_to_end(&mut data).unwrap();  | 
 | 75 | +			threads_running.fetch_add(1, atomic::Ordering::AcqRel);  | 
 | 76 | + | 
 | 77 | +			let thread_count_ref = Arc::clone(&threads_running);  | 
 | 78 | +			let main_thread_ref = std::thread::current();  | 
 | 79 | +			threads.push((path.file_name().unwrap().to_str().unwrap().to_string(),  | 
 | 80 | +				std::thread::spawn(move || {  | 
 | 81 | +					let string_logger = StringBuffer::new();  | 
 | 82 | + | 
 | 83 | +					let panic_logger = string_logger.clone();  | 
 | 84 | +					let res = if ::std::panic::catch_unwind(move || {  | 
 | 85 | +						fromstr_to_netaddress_test(&data, panic_logger);  | 
 | 86 | +					}).is_err() {  | 
 | 87 | +						Some(string_logger.into_string())  | 
 | 88 | +					} else { None };  | 
 | 89 | +					thread_count_ref.fetch_sub(1, atomic::Ordering::AcqRel);  | 
 | 90 | +					main_thread_ref.unpark();  | 
 | 91 | +					res  | 
 | 92 | +				})  | 
 | 93 | +			));  | 
 | 94 | +			while threads_running.load(atomic::Ordering::Acquire) > 32 {  | 
 | 95 | +				std::thread::park();  | 
 | 96 | +			}  | 
 | 97 | +		}  | 
 | 98 | +	}  | 
 | 99 | +	let mut failed_outputs = Vec::new();  | 
 | 100 | +	for (test, thread) in threads.drain(..) {  | 
 | 101 | +		if let Some(output) = thread.join().unwrap() {  | 
 | 102 | +			println!("\nOutput of {}:\n{}\n", test, output);  | 
 | 103 | +			failed_outputs.push(test);  | 
 | 104 | +		}  | 
 | 105 | +	}  | 
 | 106 | +	if !failed_outputs.is_empty() {  | 
 | 107 | +		println!("Test cases which failed: ");  | 
 | 108 | +		for case in failed_outputs {  | 
 | 109 | +			println!("{}", case);  | 
 | 110 | +		}  | 
 | 111 | +		panic!();  | 
 | 112 | +	}  | 
 | 113 | +}  | 
0 commit comments