// This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/.
use rkv::backend::{
BackendEnvironmentBuilder, SafeMode, SafeModeDatabase, SafeModeEnvironment,
SafeModeRoTransaction, SafeModeRwTransaction,
}; use std::fs; use std::fs::File; use std::io::Write; use std::iter; use std::path::Path; use std::sync::Arc; use std::thread; use tempfile::Builder;
type Rkv = rkv::Rkv<SafeModeEnvironment>; type SingleStore = rkv::SingleStore<SafeModeDatabase>;
fn eat_lmdb_err<T>(value: Result<T, rkv::StoreError>) -> Result<Option<T>, rkv::StoreError> { match value {
Ok(value) => Ok(Some(value)),
Err(rkv::StoreError::LmdbError(_)) => Ok(None),
Err(err) => {
println!("Not a crash, but an error outside LMDB: {}", err);
println!("A refined fuzzing test, or changes to RKV, might be required.");
Err(err)
}
}
}
#[no_mangle] pubextern"C"fn fuzz_rkv_db_file(raw_data: *const u8, size: libc::size_t) -> libc::c_int { let data = unsafe { std::slice::from_raw_parts(raw_data as *const u8, size as usize) };
// First 8192 bytes are for the lock file. if data.len() < 8192 { return0;
} let (lock, db) = data.split_at(8192); letmut lock_file = File::create("data.lock").unwrap();
lock_file.write_all(lock).unwrap(); letmut db_file = File::create("data.mdb").unwrap();
db_file.write_all(db).unwrap();
let env = Rkv::with_capacity::<SafeMode>(Path::new("."), 2).unwrap(); let store = env
.open_single("test", rkv::StoreOptions::create())
.unwrap();
let reader = env.read().unwrap();
eat_lmdb_err(store.get(&reader, &[0])).unwrap();
0
}
#[no_mangle] pubextern"C"fn fuzz_rkv_db_name(raw_data: *const u8, size: libc::size_t) -> libc::c_int { let data = unsafe { std::slice::from_raw_parts(raw_data as *const u8, size as usize) };
let root = Builder::new().prefix("fuzz_rkv_db_name").tempdir().unwrap();
fs::create_dir_all(root.path()).unwrap();
let env = Rkv::new::<SafeMode>(root.path()).unwrap(); let name = String::from_utf8_lossy(data);
println!("Checking string: '{:?}'", name); // Some strings are invalid database names, and are handled as store errors. // Ignore those errors, but not others. let store = eat_lmdb_err(env.open_single(name.as_ref(), rkv::StoreOptions::create())).unwrap();
iflet Some(store) = store { let reader = env.read().unwrap();
eat_lmdb_err(store.get(&reader, &[0])).unwrap();
};
0
}
#[no_mangle] pubextern"C"fn fuzz_rkv_key_write(raw_data: *const u8, size: libc::size_t) -> libc::c_int { let data = unsafe { std::slice::from_raw_parts(raw_data as *const u8, size as usize) };
let root = Builder::new()
.prefix("fuzz_rkv_key_write")
.tempdir()
.unwrap();
fs::create_dir_all(root.path()).unwrap();
let env = Rkv::new::<SafeMode>(root.path()).unwrap(); let store = env
.open_single("test", rkv::StoreOptions::create())
.unwrap();
letmut writer = env.write().unwrap(); // Some data are invalid values, and are handled as store errors. // Ignore those errors, but not others.
eat_lmdb_err(store.put(&mut writer, data, &rkv::Value::Str("val"))).unwrap();
0
}
#[no_mangle] pubextern"C"fn fuzz_rkv_val_write(raw_data: *const u8, size: libc::size_t) -> libc::c_int { let data = unsafe { std::slice::from_raw_parts(raw_data as *const u8, size as usize) };
let root = Builder::new()
.prefix("fuzz_rkv_val_write")
.tempdir()
.unwrap();
fs::create_dir_all(root.path()).unwrap();
let env = Rkv::new::<SafeMode>(root.path()).unwrap(); let store = env
.open_single("test", rkv::StoreOptions::create())
.unwrap();
letmut writer = env.write().unwrap(); let string = String::from_utf8_lossy(data); let value = rkv::Value::Str(&string);
store.put(&mut writer, "key", &value).unwrap();
0
}
lazy_static! { staticref STATIC_DATA: Vec<String> = { let sizes = vec![4, 16, 128, 512, 1024]; letmut data = Vec::new();
for (i, s) in sizes.into_iter().enumerate() { let bytes = iter::repeat('a'as u8 + i as u8).take(s).collect();
data.push(String::from_utf8(bytes).unwrap());
}
data
};
}
#[no_mangle] pubextern"C"fn fuzz_rkv_calls(raw_data: *const u8, size: libc::size_t) -> libc::c_int { let data = unsafe { std::slice::from_raw_parts(raw_data as *const u8, size as usize) }; letmut fuzz = data.iter().copied();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.