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