mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-27 16:01:27 +00:00
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: 9d30a941cc
("efi_loader: don't load beyond VirtualSize")
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Asherah Connor <ashe@kivikakk.ee>
This commit is contained in:
parent
d6136c63ca
commit
1ea133acd6
1 changed files with 27 additions and 4 deletions
|
@ -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 = §ions[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 = §ions[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 */
|
||||
|
|
Loading…
Add table
Reference in a new issue