use perf_event_data::endian::Native; use perf_event_data::parse::{ParseConfig, Parser}; use perf_event_data::Visitor; use perf_event_open_sys::bindings::perf_event_attr; fn fuzz_test(data: &[u8]) { struct ParseVisitor; impl Visitor<'_> for ParseVisitor { type Output = (); fn visit_unimplemented<'a>(self, _: perf_event_data::RecordMetadata) {} } let attr_len = std::mem::size_of::(); if data.len() < attr_len { return; } let (head, rest) = data.split_at(attr_len); let mut attr = perf_event_attr::default(); unsafe { std::ptr::copy_nonoverlapping(head.as_ptr(), &mut attr as *mut _ as *mut u8, attr_len); } let config = ParseConfig::::from(attr); let mut parser = Parser::new(rest, config); let _ = parser.parse_record(ParseVisitor); } #[test] fn fuzz_test_1() { let data = [ 224, 115, 115, 93, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 59, 115, 115, 115, 115, 115, 115, 115, 115, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 197, 197, 197, 197, 197, 197, 255, 255, 255, 255, 38, 255, 255, 255, 255, 224, 115, 115, 93, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 255, 255, 255, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 255, 255, 255, 255, 255, 255, 255, 255, 115, 115, 115, ]; fuzz_test(&data); }