pub const MAX_INFLATE_EXPANSION: usize = 1032;
pub const MAX_INFLATE_RESERVE: usize = 64 * 1024 * 1024;
pub fn bounded_inflate_reserve(size_hint: usize, compressed_len: usize) -> usize {
let input_ceiling = compressed_len.saturating_mul(MAX_INFLATE_EXPANSION);
size_hint.min(input_ceiling).clamp(64, MAX_INFLATE_RESERVE)
}
#[cfg(test)]
mod tests {
use super::{bounded_inflate_reserve, MAX_INFLATE_RESERVE};
#[test]
fn bounded_inflate_reserve_caps_attacker_declared_size() {
assert_eq!(bounded_inflate_reserve(u64::MAX as usize, 10), 10 * 1032);
assert_eq!(
bounded_inflate_reserve(usize::MAX, usize::MAX),
MAX_INFLATE_RESERVE
);
assert_eq!(bounded_inflate_reserve(1000, 500), 1000);
assert_eq!(bounded_inflate_reserve(0, 0), 64);
}
}