mirror of
https://github.com/rustfs/rustfs.git
synced 2026-07-26 16:28:15 +00:00
66 lines
2.5 KiB
Rust
66 lines
2.5 KiB
Rust
#![no_main]
|
|
|
|
use libfuzzer_sys::fuzz_target;
|
|
mod bucket_validation_storage_api;
|
|
use bucket_validation_storage_api::{
|
|
check_bucket_and_object_names, check_list_objs_args, check_valid_bucket_name_strict, is_meta_bucketname,
|
|
};
|
|
|
|
fn parse_case(data: &[u8]) -> (String, String) {
|
|
let text = String::from_utf8_lossy(data);
|
|
let mut parts = text.splitn(2, '\n');
|
|
let bucket = parts.next().unwrap_or_default().to_string();
|
|
let object = parts.next().unwrap_or_default().to_string();
|
|
(bucket, object)
|
|
}
|
|
|
|
fn looks_like_ipv4(text: &str) -> bool {
|
|
let parts: Vec<_> = text.split('.').collect();
|
|
parts.len() == 4
|
|
&& parts
|
|
.iter()
|
|
.all(|part| !part.is_empty() && part.chars().all(|ch| ch.is_ascii_digit()))
|
|
}
|
|
|
|
fuzz_target!(|data: &[u8]| {
|
|
let (bucket, object) = parse_case(data);
|
|
|
|
let strict_bucket_ok = check_valid_bucket_name_strict(&bucket).is_ok();
|
|
let valid_bucket_for_object_ops = strict_bucket_ok || is_meta_bucketname(&bucket);
|
|
let pair_ok = check_bucket_and_object_names(&bucket, &object).is_ok();
|
|
let list_ok = check_list_objs_args(&bucket, &object, &None).is_ok();
|
|
|
|
if strict_bucket_ok {
|
|
let trimmed = bucket.trim();
|
|
assert!((3..=63).contains(&trimmed.len()), "accepted bucket has invalid length: {:?}", bucket);
|
|
assert_eq!(trimmed, bucket, "strict bucket validation should not accept leading/trailing whitespace");
|
|
assert!(trimmed != "rustfs", "strict bucket validation should reject reserved bucket name");
|
|
assert!(!looks_like_ipv4(trimmed), "strict bucket validation should reject IPv4 bucket names");
|
|
assert!(
|
|
!trimmed.contains("..") && !trimmed.contains(".-") && !trimmed.contains("-."),
|
|
"strict bucket validation should reject forbidden bucket sequences"
|
|
);
|
|
assert!(
|
|
trimmed
|
|
.chars()
|
|
.all(|ch| ch.is_ascii_lowercase() || ch.is_ascii_digit() || ch == '.' || ch == '-'),
|
|
"strict bucket validation accepted an unexpected character set: {:?}",
|
|
bucket
|
|
);
|
|
}
|
|
|
|
if pair_ok {
|
|
assert!(
|
|
valid_bucket_for_object_ops,
|
|
"accepted bucket/object pair must satisfy strict bucket validation or meta bucket compatibility"
|
|
);
|
|
}
|
|
|
|
if list_ok {
|
|
assert!(
|
|
valid_bucket_for_object_ops,
|
|
"accepted list-object args must satisfy strict bucket validation or meta bucket compatibility"
|
|
);
|
|
}
|
|
});
|