xref: /aosp_15_r20/external/crosvm/fuse/src/fuzzing.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2019 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use std::io;
6*bb4ee6a4SAndroid Build Coastguard Worker use std::os::unix::io::AsRawFd;
7*bb4ee6a4SAndroid Build Coastguard Worker 
8*bb4ee6a4SAndroid Build Coastguard Worker use base::Protection;
9*bb4ee6a4SAndroid Build Coastguard Worker 
10*bb4ee6a4SAndroid Build Coastguard Worker use crate::filesystem::DirEntry;
11*bb4ee6a4SAndroid Build Coastguard Worker use crate::filesystem::DirectoryIterator;
12*bb4ee6a4SAndroid Build Coastguard Worker use crate::filesystem::FileSystem;
13*bb4ee6a4SAndroid Build Coastguard Worker use crate::filesystem::ZeroCopyReader;
14*bb4ee6a4SAndroid Build Coastguard Worker use crate::filesystem::ZeroCopyWriter;
15*bb4ee6a4SAndroid Build Coastguard Worker use crate::server::Mapper;
16*bb4ee6a4SAndroid Build Coastguard Worker use crate::server::Reader;
17*bb4ee6a4SAndroid Build Coastguard Worker use crate::server::Server;
18*bb4ee6a4SAndroid Build Coastguard Worker use crate::server::Writer;
19*bb4ee6a4SAndroid Build Coastguard Worker 
20*bb4ee6a4SAndroid Build Coastguard Worker // Use a file system that does nothing since we are fuzzing the server implementation.
21*bb4ee6a4SAndroid Build Coastguard Worker struct NullFs;
22*bb4ee6a4SAndroid Build Coastguard Worker impl FileSystem for NullFs {
23*bb4ee6a4SAndroid Build Coastguard Worker     type Inode = u64;
24*bb4ee6a4SAndroid Build Coastguard Worker     type Handle = u64;
25*bb4ee6a4SAndroid Build Coastguard Worker     type DirIter = NullIter;
26*bb4ee6a4SAndroid Build Coastguard Worker }
27*bb4ee6a4SAndroid Build Coastguard Worker 
28*bb4ee6a4SAndroid Build Coastguard Worker struct NullIter;
29*bb4ee6a4SAndroid Build Coastguard Worker impl DirectoryIterator for NullIter {
next(&mut self) -> Option<DirEntry>30*bb4ee6a4SAndroid Build Coastguard Worker     fn next(&mut self) -> Option<DirEntry> {
31*bb4ee6a4SAndroid Build Coastguard Worker         None
32*bb4ee6a4SAndroid Build Coastguard Worker     }
33*bb4ee6a4SAndroid Build Coastguard Worker }
34*bb4ee6a4SAndroid Build Coastguard Worker 
35*bb4ee6a4SAndroid Build Coastguard Worker struct NullMapper;
36*bb4ee6a4SAndroid Build Coastguard Worker impl Mapper for NullMapper {
map( &self, _mem_offset: u64, _size: usize, _fd: &dyn AsRawFd, _file_offset: u64, _prot: Protection, ) -> io::Result<()>37*bb4ee6a4SAndroid Build Coastguard Worker     fn map(
38*bb4ee6a4SAndroid Build Coastguard Worker         &self,
39*bb4ee6a4SAndroid Build Coastguard Worker         _mem_offset: u64,
40*bb4ee6a4SAndroid Build Coastguard Worker         _size: usize,
41*bb4ee6a4SAndroid Build Coastguard Worker         _fd: &dyn AsRawFd,
42*bb4ee6a4SAndroid Build Coastguard Worker         _file_offset: u64,
43*bb4ee6a4SAndroid Build Coastguard Worker         _prot: Protection,
44*bb4ee6a4SAndroid Build Coastguard Worker     ) -> io::Result<()> {
45*bb4ee6a4SAndroid Build Coastguard Worker         Err(io::Error::from_raw_os_error(libc::EOPNOTSUPP))
46*bb4ee6a4SAndroid Build Coastguard Worker     }
47*bb4ee6a4SAndroid Build Coastguard Worker 
unmap(&self, _offset: u64, _size: u64) -> io::Result<()>48*bb4ee6a4SAndroid Build Coastguard Worker     fn unmap(&self, _offset: u64, _size: u64) -> io::Result<()> {
49*bb4ee6a4SAndroid Build Coastguard Worker         Err(io::Error::from_raw_os_error(libc::EOPNOTSUPP))
50*bb4ee6a4SAndroid Build Coastguard Worker     }
51*bb4ee6a4SAndroid Build Coastguard Worker }
52*bb4ee6a4SAndroid Build Coastguard Worker 
53*bb4ee6a4SAndroid Build Coastguard Worker /// Fuzz the server implementation.
fuzz_server<R: Reader + ZeroCopyReader, W: Writer + ZeroCopyWriter>(r: R, w: W)54*bb4ee6a4SAndroid Build Coastguard Worker pub fn fuzz_server<R: Reader + ZeroCopyReader, W: Writer + ZeroCopyWriter>(r: R, w: W) {
55*bb4ee6a4SAndroid Build Coastguard Worker     let server = Server::new(NullFs);
56*bb4ee6a4SAndroid Build Coastguard Worker     let mapper = NullMapper {};
57*bb4ee6a4SAndroid Build Coastguard Worker 
58*bb4ee6a4SAndroid Build Coastguard Worker     let _ = server.handle_message(r, w, mapper);
59*bb4ee6a4SAndroid Build Coastguard Worker }
60