blob: 0a95bda09b29177b1d783544c46627a3d5c46f45 [file] [log] [blame]
// 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 diagnostics_data::LogsData;
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<LogsData> {
logs::convert_debuglog_to_log_message(&record.0)
}
impl<'a> Arbitrary<'a> for RandomLogRecord {
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
let sequence = u64::arbitrary(u)?;
let padding1: [zx::sys::PadByte; 4] = Default::default();
let mut datalen = u16::arbitrary(u)?;
if usize::from(datalen) > zx::sys::ZX_LOG_RECORD_DATA_MAX {
datalen = zx::sys::ZX_LOG_RECORD_DATA_MAX.to_string().parse::<u16>().unwrap();
}
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 {
sequence,
padding1,
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>()),
)
}
}