in src/enclave_proc/resource_manager.rs [1093:1158]
fn write_eif_to_regions(
eif_file: &mut File,
regions: &[MemoryRegion],
image_write_offset: usize,
) -> NitroCliResult<()> {
let file_size = eif_file
.metadata()
.map_err(|_| {
new_nitro_cli_failure!(
"Failed to obtain EIF file metadata",
NitroCliErrorEnum::FileOperationFailure
)
})?
.len() as usize;
eif_file.rewind().map_err(|_| {
new_nitro_cli_failure!(
"Failed to seek to the beginning of the EIF file",
NitroCliErrorEnum::FileOperationFailure
)
})?;
let mut total_written: usize = 0;
for region in regions {
let offset_plus_file_size = file_size.checked_add(image_write_offset).ok_or_else(|| {
new_nitro_cli_failure!(
"Memory overflow when trying to write EIF file",
NitroCliErrorEnum::MemoryOverflow
)
})?;
if total_written >= offset_plus_file_size {
// All bytes have been written.
break;
}
let written_plus_region_size = total_written
.checked_add(region.mem_size as usize)
.ok_or_else(|| {
new_nitro_cli_failure!(
"Memory overflow when trying to write EIF file",
NitroCliErrorEnum::MemoryOverflow
)
})?;
if written_plus_region_size <= image_write_offset {
// All bytes need to be skipped to get to the image write offset.
} else {
let region_offset = image_write_offset.saturating_sub(total_written);
let file_offset = total_written.saturating_sub(image_write_offset);
let size = std::cmp::min(
region.mem_size as usize - region_offset,
file_size - file_offset,
);
region
.fill_from_file(eif_file, region_offset, size)
.map_err(|e| {
e.add_subaction("Failed to fill region with file content".to_string())
})?;
}
total_written += region.mem_size as usize;
}
Ok(())
}