| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| //! This module contains fuzzing targets for Archivist. |
| |
| use arbitrary::{Arbitrary, Result, Unstructured}; |
| use archivist_lib::logs; |
| use archivist_lib::logs::Message; |
| use fuchsia_zircon as zx; |
| use fuzz::fuzz; |
| |
| #[derive(Clone, Debug)] |
| struct RandomLogRecord(zx::sys::zx_log_record_t); |
| |
| /// Fuzzer for kernel debuglog parser. |
| #[fuzz] |
| fn convert_debuglog_to_log_message_fuzzer(record: RandomLogRecord) -> Option<Message> { |
| logs::convert_debuglog_to_log_message(&record.0) |
| } |
| |
| impl Arbitrary for RandomLogRecord { |
| fn arbitrary(u: &mut Unstructured<'_>) -> Result<Self> { |
| let unused = u32::arbitrary(u)?; |
| let datalen = u16::arbitrary(u)?; |
| let severity = u8::arbitrary(u)?; |
| let flags = u8::arbitrary(u)?; |
| let timestamp = i64::arbitrary(u)? as zx::sys::zx_time_t; |
| let pid = u64::arbitrary(u)?; |
| let tid = u64::arbitrary(u)?; |
| |
| // Fill the first datalen bytes of data. |
| let mut data = [0 as u8; zx::sys::ZX_LOG_RECORD_DATA_MAX]; |
| let mut partial = &mut data[0..datalen as usize]; |
| u.fill_buffer(&mut partial)?; |
| |
| Ok(RandomLogRecord(zx::sys::zx_log_record_t { |
| unused, |
| datalen, |
| severity, |
| flags, |
| timestamp, |
| pid, |
| tid, |
| data, |
| })) |
| } |
| |
| fn size_hint(_: usize) -> (usize, Option<usize>) { |
| ( |
| std::mem::size_of::<zx::sys::zx_log_record_t>(), |
| Some(std::mem::size_of::<zx::sys::zx_log_record_t>()), |
| ) |
| } |
| } |