use binder::binder_impl::Parcel;
use binder::unstable_api::{AParcel, AsNative};
use binder::SpIBinder;
use binder_random_parcel_bindgen::{createRandomParcel, fuzzRustService};
use std::os::raw::c_void;
pub fn create_random_parcel(fuzzer_data: &[u8]) -> Parcel {
let mut parcel = Parcel::new();
let aparcel_ptr: *mut AParcel = parcel.as_native_mut();
let ptr = aparcel_ptr as *mut c_void;
unsafe {
createRandomParcel(ptr, fuzzer_data.as_ptr(), fuzzer_data.len());
}
parcel
}
pub fn fuzz_service(binder: &mut SpIBinder, fuzzer_data: &[u8]) {
let mut binders = [binder];
fuzz_multiple_services(&mut binders, fuzzer_data);
}
pub fn fuzz_multiple_services(binders: &mut [&mut SpIBinder], fuzzer_data: &[u8]) {
let mut cppBinders = vec![];
for binder in binders.iter_mut() {
let ptr = binder.as_native_mut() as *mut c_void;
cppBinders.push(ptr);
}
unsafe {
fuzzRustService(
cppBinders.as_mut_ptr(),
cppBinders.len(),
fuzzer_data.as_ptr(),
fuzzer_data.len(),
);
}
}