efi_loader: parameter check in SetVirtualAddressMap

Check the parameters DescriptorSize and DescriptiorVersion of
SetVirtualAddressMap() as prescribed by the UEFI specification.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
Heinrich Schuchardt 2019-08-14 05:19:37 +02:00
parent a6d37098bd
commit 53e1d8fae8

View file

@ -641,12 +641,17 @@ static efi_status_t EFIAPI efi_set_virtual_address_map(
{
efi_uintn_t n = memory_map_size / descriptor_size;
efi_uintn_t i;
efi_status_t ret = EFI_INVALID_PARAMETER;
int rt_code_sections = 0;
struct efi_event *event;
EFI_ENTRY("%zx %zx %x %p", memory_map_size, descriptor_size,
descriptor_version, virtmap);
if (descriptor_version != EFI_MEMORY_DESCRIPTOR_VERSION ||
descriptor_size < sizeof(struct efi_mem_desc))
goto out;
efi_virtmap = virtmap;
efi_descriptor_size = descriptor_size;
efi_descriptor_count = n;
@ -677,7 +682,7 @@ static efi_status_t EFIAPI efi_set_virtual_address_map(
* We expose exactly one single runtime code section, so
* something is definitely going wrong.
*/
return EFI_EXIT(EFI_INVALID_PARAMETER);
goto out;
}
/* Notify EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE */
@ -738,11 +743,13 @@ static efi_status_t EFIAPI efi_set_virtual_address_map(
efi_relocate_runtime_table(new_offset);
efi_runtime_relocate(new_offset, map);
return EFI_EXIT(EFI_SUCCESS);
ret = EFI_SUCCESS;
goto out;
}
}
return EFI_EXIT(EFI_INVALID_PARAMETER);
out:
return EFI_EXIT(ret);
}
/**