xref: /cloud-hypervisor/fuzz/fuzz_targets/cmos.rs (revision eeae63b4595fbf0cc69f62b6e9d9a79c543c4ac7)
1 // Copyright © 2022 Intel Corporation
2 //
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #![no_main]
6 use devices::legacy::Cmos;
7 use libc::EFD_NONBLOCK;
8 use libfuzzer_sys::{fuzz_target, Corpus};
9 use vm_device::BusDevice;
10 use vmm_sys_util::eventfd::EventFd;
11 
12 fuzz_target!(|bytes: &[u8]| -> Corpus {
13     // Need at least 16 bytes for the test
14     if bytes.len() < 16 {
15         return Corpus::Reject;
16     }
17 
18     let mut below_4g = [0u8; 8];
19     let mut above_4g = [0u8; 8];
20 
21     below_4g.copy_from_slice(&bytes[0..8]);
22     above_4g.copy_from_slice(&bytes[8..16]);
23 
24     let mut cmos = Cmos::new(
25         u64::from_le_bytes(below_4g),
26         u64::from_le_bytes(above_4g),
27         EventFd::new(EFD_NONBLOCK).unwrap(),
28         None,
29     );
30 
31     let mut i = 16;
32     while i < bytes.len() {
33         let read = bytes.get(i).unwrap_or(&0) % 2 == 0;
34         i += 1;
35 
36         if read {
37             let offset = (bytes.get(i).unwrap_or(&0) % 2) as u64;
38             i += 1;
39             let mut out_bytes = vec![0];
40             cmos.read(0, offset, &mut out_bytes);
41         } else {
42             let offset = (bytes.get(i).unwrap_or(&0) % 2) as u64;
43             i += 1;
44             let data = vec![*bytes.get(i).unwrap_or(&0)];
45             i += 1;
46             cmos.write(0, offset, &data);
47         }
48     }
49 
50     Corpus::Keep
51 });
52