41 lines
1.7 KiB
Rust
41 lines
1.7 KiB
Rust
use std::io::{Cursor, Write};
|
|
use tokio::runtime::Runtime;
|
|
use xmpp_proxy::stanzafilter::{StanzaFilter, StanzaReader};
|
|
|
|
fn main() {
|
|
std::fs::create_dir_all("/tmp/afl_test_gen/").unwrap();
|
|
afl::fuzz!(|data: &[u8]| {
|
|
let rt = Runtime::new().unwrap();
|
|
|
|
rt.block_on(async {
|
|
let mut filter = StanzaFilter::new(262_144);
|
|
let mut stanza_reader = StanzaReader(Cursor::new(data));
|
|
while let Ok(Some(stanza)) = stanza_reader.next(&mut filter).await {
|
|
let mut fp = rxml::FeedParser::default();
|
|
let result = rxml::as_eof_flag(fp.parse_all(&mut &stanza[..], true, |_ev| {
|
|
//println!("got event: {:?}", ev);
|
|
}));
|
|
// true indicates eof
|
|
if let Ok(result) = result {
|
|
if result {
|
|
// wow, afl generated us valid XML, lets output it as a test case
|
|
let fname = sha256::digest(stanza);
|
|
if let Ok(mut file) = std::fs::OpenOptions::new()
|
|
.read(true)
|
|
.write(true)
|
|
.create_new(true)
|
|
.open("/tmp/afl_test_gen/".to_owned() + fname.as_str())
|
|
{
|
|
file.write_all(stanza).unwrap();
|
|
file.sync_all().unwrap();
|
|
}
|
|
} else {
|
|
// more data is required, stanzafilter should never let this happen, let's panic
|
|
panic!("more data required?");
|
|
}
|
|
}
|
|
}
|
|
})
|
|
});
|
|
}
|