Commit 1ea133ac authored by Heinrich Schuchardt's avatar Heinrich Schuchardt Committed by Heinrich Schuchardt
Browse files

efi_loader: sections with zero VirtualSize

In a section header VirtualSize may be zero. This is for instance seen in
the .sbat section of shim. In this case use SizeOfRawData as section size.

Fixes: 9d30a941

 ("efi_loader: don't load beyond VirtualSize")
Signed-off-by: default avatarHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: default avatarAsherah Connor <ashe@kivikakk.ee>
parent d6136c63
......@@ -800,6 +800,23 @@ efi_status_t efi_check_pe(void *buffer, size_t size, void **nt_header)
return EFI_SUCCESS;
}
/**
* section_size() - determine size of section
*
* The size of a section in memory if normally given by VirtualSize.
* If VirtualSize is not provided, use SizeOfRawData.
*
* @sec: section header
* Return: size of section in memory
*/
static u32 section_size(IMAGE_SECTION_HEADER *sec)
{
if (sec->Misc.VirtualSize)
return sec->Misc.VirtualSize;
else
return sec->SizeOfRawData;
}
/**
* efi_load_pe() - relocate EFI binary
*
......@@ -869,8 +886,9 @@ efi_status_t efi_load_pe(struct efi_loaded_image_obj *handle,
/* Calculate upper virtual address boundary */
for (i = num_sections - 1; i >= 0; i--) {
IMAGE_SECTION_HEADER *sec = &sections[i];
virt_size = max_t(unsigned long, virt_size,
sec->VirtualAddress + sec->Misc.VirtualSize);
sec->VirtualAddress + section_size(sec));
}
/* Read 32/64bit specific header bits */
......@@ -931,11 +949,16 @@ efi_status_t efi_load_pe(struct efi_loaded_image_obj *handle,
/* Load sections into RAM */
for (i = num_sections - 1; i >= 0; i--) {
IMAGE_SECTION_HEADER *sec = &sections[i];
memset(efi_reloc + sec->VirtualAddress, 0,
sec->Misc.VirtualSize);
u32 copy_size = section_size(sec);
if (copy_size > sec->SizeOfRawData) {
copy_size = sec->SizeOfRawData;
memset(efi_reloc + sec->VirtualAddress, 0,
sec->Misc.VirtualSize);
}
memcpy(efi_reloc + sec->VirtualAddress,
efi + sec->PointerToRawData,
min(sec->Misc.VirtualSize, sec->SizeOfRawData));
copy_size);
}
/* Run through relocations */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment