use core::alloc::Layout;
use core::ptr::NonNull;
use allocator_api2::alloc::{AllocError, Allocator};
#[allow(
clippy::map_err_ignore,
reason = "LayoutError carries no payload; only the AllocError variant matters"
)]
#[cfg_attr(test, mutants::skip)]
#[inline]
pub(crate) fn alloc_chunk_raw<A: Allocator>(
allocator: &A,
header_size: usize,
header_align: usize,
payload_size: usize,
) -> Result<(*mut u8, Layout), AllocError> {
let total = header_size.checked_add(payload_size).ok_or(AllocError)?;
let layout = Layout::from_size_align(total, header_align).map_err(|_| AllocError)?;
let raw = allocator.allocate(layout)?;
let raw_u8_ptr: *mut u8 = raw.cast::<u8>().as_ptr();
let start_addr = raw_u8_ptr as usize;
let end_addr = start_addr.checked_add(total).ok_or(AllocError)?;
if end_addr > isize::MAX as usize {
unsafe {
allocator.deallocate(NonNull::new_unchecked(raw_u8_ptr), layout);
}
return Err(AllocError);
}
Ok((raw_u8_ptr, layout))
}