fuzz/fuzz_targets/photo_asset_from_record.rs
Rama main · réplica de lectura del repositorio original.
#![no_main]
// Drives the validated `PhotoAsset` record-pair constructor - the hot path
// that turns two CloudKit `Record` JSON values into a typed PhotoAsset.
// The internal extractors (decode_filename, resolve_item_type,
// extract_versions, metadata::extract) chain through five sibling modules
// plus crate::state::AssetMetadata, so a panic anywhere in there ends up
// here.
//
// `Record` parses as JSON, so the harness needs two JSON values per
// iteration. Split the input on the first NUL into (master, asset). If
// the input doesn't contain a NUL, both halves get the same bytes - still
// useful, since same-shape pairs exercise the version-dedup logic that
// record construction does.
use libfuzzer_sys::fuzz_target;
use serde_json::Value;
fuzz_target!(|data: &[u8]| {
let (master_bytes, asset_bytes) = match data.iter().position(|b| *b == 0) {
Some(i) => (&data[..i], &data[i + 1..]),
None => (data, data),
};
let Ok(master) = serde_json::from_slice::<Value>(master_bytes) else {
return;
};
let Ok(asset) = serde_json::from_slice::<Value>(asset_bytes) else {
return;
};
kei::__fuzz::photo_asset_from_record_json(master, asset);
});