in sgx_align_struct_attribute/src/layout.rs [87:123]
fn check_align_req(size: usize, align_req: &[AlignReq]) -> bool {
if align_req.is_empty() {
return false;
}
let len: usize = (size + 7) / 8;
let bmp: &mut [u8] = unsafe {
let ptr = libc::malloc(len) as *mut u8;
if ptr.is_null() {
return false;
}
ptr::write_bytes(ptr, 0, len);
slice::from_raw_parts_mut(ptr, len)
};
for req in align_req {
if check_overflow(req.offset, req.len) || (req.offset + req.len) > size {
unsafe {
libc::free(bmp.as_mut_ptr() as *mut c_void);
}
return false;
} else {
for i in 0..req.len {
let offset = req.offset + i;
if (bmp[offset / 8] & 1 << (offset % 8)) != 0 {
// overlap in req data
unsafe {
libc::free(bmp.as_mut_ptr() as *mut c_void);
}
return false;
}
let tmp: u8 = (1 << (offset % 8)) as u8;
bmp[offset / 8] |= tmp;
}
}
}
true
}