znippy-common/fuzz/fuzz_targets/archive_open.rs
//! A whole `.znippy` from nowhere: every index read a consumer of an untrusted
//! archive reaches (open, list, verified extract, lookup reader, metadata and
//! fsmeta sections) must end in Ok or Err, never a panic, an abort or OOM.
#![no_main]
use std::io::Write;
use std::sync::OnceLock;
use libfuzzer_sys::fuzz_target;
use znippy_common::{ArchiveReader, ZnippyArchive, ZnippyReader};
fn scratch() -> &'static std::path::Path {
static P: OnceLock<std::path::PathBuf> = OnceLock::new();
P.get_or_init(|| {
let dir = std::env::temp_dir().join(format!("znippy-fuzz-{}", std::process::id()));
std::fs::create_dir_all(&dir).unwrap();
dir.join("in.znippy")
})
}
fuzz_target!(|data: &[u8]| {
let path = scratch();
{
let mut f = std::fs::File::create(path).unwrap();
f.write_all(data).unwrap();
}
if let Ok(a) = ZnippyArchive::open(path) {
let mut names = a.list_files().unwrap_or_default();
names.sort();
for n in names.iter().take(64) {
let _ = a.extract_file_verified(n);
}
let _ = a.try_as_rust();
let _ = a.try_as_maven();
let _ = a.try_as_python();
}
if let Ok(r) = ArchiveReader::open(path) {
let _ = r.row_count();
}
let _ = znippy_common::read_archive_meta(path);
let _ = znippy_common::fsmeta::read_fsmeta(path);
let _ = znippy_common::verify_archive_integrity(path);
});