mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2024-11-25 13:23:08 +00:00
fcc28f5573
IoBuf is defined in a platform-specific way (it is either iovec on unix or WSABUF for windows), so it fits into the mission statement of the base crate, which is meant to be *the* platform abstraction layer in crosvm. IoBufMut and VolatileMemory/VolatileSlice are defined in terms of IoBuf, so they are also moved into base for consistency. Every crate that uses these types already depended on base, so no extra dependencies are added, and a few can be removed. BUG=b:312312646 TEST=tools/dev_container tools/presubmit Change-Id: I4dddc55d46906dfc55b88e8e6a967d7e1c1922dd Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/5046605 Reviewed-by: Dennis Kempin <denniskempin@google.com> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
45 lines
1.4 KiB
Rust
45 lines
1.4 KiB
Rust
// Copyright 2019 The ChromiumOS Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#![cfg(not(test))]
|
|
#![no_main]
|
|
|
|
use std::io::Cursor;
|
|
use std::io::Read;
|
|
use std::io::Seek;
|
|
use std::io::SeekFrom;
|
|
use std::io::Write;
|
|
use std::mem::size_of;
|
|
|
|
use base::FileReadWriteAtVolatile;
|
|
use base::VolatileSlice;
|
|
use crosvm_fuzz::fuzz_target;
|
|
use disk::QcowFile;
|
|
|
|
// Take the first 64 bits of data as an address and the next 64 bits as data to
|
|
// store there. The rest of the data is used as a qcow image.
|
|
fuzz_target!(|bytes| {
|
|
if bytes.len() < 16 {
|
|
// Need an address and data, each are 8 bytes.
|
|
return;
|
|
}
|
|
let mut disk_image = Cursor::new(bytes);
|
|
let addr = read_u64(&mut disk_image);
|
|
let value = read_u64(&mut disk_image);
|
|
let max_nesting_depth = 10;
|
|
let mut disk_file = tempfile::tempfile().unwrap();
|
|
disk_file.write_all(&bytes[16..]).unwrap();
|
|
disk_file.seek(SeekFrom::Start(0)).unwrap();
|
|
if let Ok(mut qcow) = QcowFile::from(disk_file, max_nesting_depth) {
|
|
let mut mem = value.to_le_bytes().to_owned();
|
|
let vslice = VolatileSlice::new(&mut mem);
|
|
let _ = qcow.write_all_at_volatile(vslice, addr);
|
|
}
|
|
});
|
|
|
|
fn read_u64<T: Read>(readable: &mut T) -> u64 {
|
|
let mut buf = [0u8; size_of::<u64>()];
|
|
readable.read_exact(&mut buf[..]).unwrap();
|
|
u64::from_le_bytes(buf)
|
|
}
|