Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/znippy

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);
});