diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-12 05:43:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-12 05:43:14 +0000 |
commit | 8dd16259287f58f9273002717ec4d27e97127719 (patch) | |
tree | 3863e62a53829a84037444beab3abd4ed9dfc7d0 /third_party/rust/neqo-common/src/fuzz.rs | |
parent | Releasing progress-linux version 126.0.1-1~progress7.99u1. (diff) | |
download | firefox-8dd16259287f58f9273002717ec4d27e97127719.tar.xz firefox-8dd16259287f58f9273002717ec4d27e97127719.zip |
Merging upstream version 127.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/neqo-common/src/fuzz.rs')
-rw-r--r-- | third_party/rust/neqo-common/src/fuzz.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/third_party/rust/neqo-common/src/fuzz.rs b/third_party/rust/neqo-common/src/fuzz.rs new file mode 100644 index 0000000000..d0a35a49ae --- /dev/null +++ b/third_party/rust/neqo-common/src/fuzz.rs @@ -0,0 +1,43 @@ +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::{ + collections::hash_map::DefaultHasher, + fs::File, + hash::{Hash, Hasher}, + io::Write, + path::Path, +}; + +/// Write a data item `data` for the fuzzing target `target` to the fuzzing corpus. The caller needs +/// to make sure that `target` is the correct fuzzing target name for the data written. +/// +/// # Panics +/// +/// Panics if the corpus directory does not exist or if the corpus item cannot be written. +pub fn write_item_to_fuzzing_corpus(target: &str, data: &[u8]) { + // This bakes in the assumption that we're executing in the root of the neqo workspace. + // Unfortunately, `cargo fuzz` doesn't provide a way to learn the location of the corpus + // directory. + let corpus = Path::new("../fuzz/corpus").join(target); + if !corpus.exists() { + std::fs::create_dir_all(&corpus).expect("failed to create corpus directory"); + } + + // Hash the data to get a unique name for the corpus item. + let mut hasher = DefaultHasher::new(); + data.hash(&mut hasher); + let item_name = hex::encode(hasher.finish().to_be_bytes()); + let item_path = corpus.join(item_name); + if item_path.exists() { + // Don't overwrite existing corpus items. + return; + } + + // Write the data to the corpus item. + let mut file = File::create(item_path).expect("failed to create corpus item"); + Write::write_all(&mut file, data).expect("failed to write to corpus item"); +} |