Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
3.0 kB · 81 lines
Rust
at main
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182use torque_tracker_engine::file::{SansIO, header::ImpulseHeader, pattern::PatternParser};
#[macro_use]extern crate afl;extern crate torque_tracker_engine;
fn main() { // simple header parser // fuzz!(|data: &[u8]| { // if let Some((base, data)) = data.split_first_chunk() { // if let Ok(mut parser) = ImpulseHeader::parse(base) { // parser.parse(data); // } // } // });
// // simple header + pattern parser // fuzz!(|data: &[u8]| { // let Some((base, data)) = data.split_first_chunk() else { // return; // }; // let Ok(mut parser) = ImpulseHeader::parse(base) else { // return; // }; // let SansIO::Finished(header, _) = parser.parse(data) else { // return; // }; // for pattern_ptr in header.pattern_offsets.into_iter().flatten() { // let Some(data) = data.get(usize::try_from(pattern_ptr.get().get()).unwrap()..) else { // continue; // }; // let Some((base, data)) = data.split_first_chunk() else { // continue; // }; // let Ok(mut parser) = PatternParser::new(base) else { // continue; // }; // parser.parse(data); // } // })
// header loop fuzz!(|header: ImpulseHeader| { let mut raw_data = vec![0; ImpulseHeader::BASE_SIZE]; let mut writer = header.write(raw_data.first_chunk_mut().unwrap()); let mut position = ImpulseHeader::BASE_SIZE; loop { raw_data.extend(std::iter::repeat_n(0, 4)); let slice = &mut raw_data[position..]; match writer.write(slice) { SansIO::Finished(_, _) => break, SansIO::Pending(written) => position += written, } } // raw_data now contains the written song data let mut parser = ImpulseHeader::parse(raw_data.first_chunk().unwrap()).unwrap(); let SansIO::Finished(tripped_header, _) = parser.parse(&raw_data[ImpulseHeader::BASE_SIZE..]) else { panic!("i give complete data, so should finish immediately"); }; let tripped_header = ImpulseHeader::try_from(tripped_header).expect("i create from valid data");
// sanitize c-string name of the old header. This data is invalid and therefore lost in roundtrip // let song_name = { // let mut name = [0; _]; // let c_str = CStr::from_bytes_until_nul(&header.song_name) // .unwrap_or_default() // .to_bytes(); // name.iter_mut().zip(c_str).for_each(|(t, s)| *t = *s); // name // }; // let header = ImpulseHeader { // song_name, // ..header // }; // check roundtrip assert_eq!(header, tripped_header); })}