summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mbrown@fensystems.co.uk>2018-03-09 17:51:09 +0000
committerPeter Jones <pjones@redhat.com>2018-03-14 13:47:52 -0400
commitd7daa70e0d01a06e3cf747d0fd63812a34014529 (patch)
tree83a4facfca2186e4a1e5a9ff49c455e357ffdff9
parent0a4c7d5af390f26e299ee2e3b1dce3225a7a0376 (diff)
downloadefi-boot-shim-d7daa70e0d01a06e3cf747d0fd63812a34014529.tar.gz
efi-boot-shim-d7daa70e0d01a06e3cf747d0fd63812a34014529.zip
Allow memory allocated by handle_image() to be freed
There is currently no way for a caller of handle_image() to free the memory allocated to hold the relocated executable. Fix by adding the allocated memory address and number of pages as returned parameters from handle_image(). Signed-off-by: Michael Brown <mbrown@fensystems.co.uk>
-rw-r--r--shim.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/shim.c b/shim.c
index a45cbf5d..bfcfd382 100644
--- a/shim.c
+++ b/shim.c
@@ -1221,7 +1221,9 @@ static EFI_STATUS read_header(void *data, unsigned int datasize,
*/
static EFI_STATUS handle_image (void *data, unsigned int datasize,
EFI_LOADED_IMAGE *li,
- EFI_IMAGE_ENTRY_POINT *entry_point)
+ EFI_IMAGE_ENTRY_POINT *entry_point,
+ EFI_PHYSICAL_ADDRESS *alloc_address,
+ UINTN *alloc_pages)
{
EFI_STATUS efi_status;
char *buffer;
@@ -1230,7 +1232,6 @@ static EFI_STATUS handle_image (void *data, unsigned int datasize,
char *base, *end;
PE_COFF_LOADER_IMAGE_CONTEXT context;
unsigned int alignment, alloc_size;
- EFI_PHYSICAL_ADDRESS alloc_address;
int found_entry_point = 0;
UINT8 sha1hash[SHA1_DIGEST_SIZE];
UINT8 sha256hash[SHA256_DIGEST_SIZE];
@@ -1293,22 +1294,23 @@ static EFI_STATUS handle_image (void *data, unsigned int datasize,
alloc_size = ALIGN_VALUE(context.ImageSize + context.SectionAlignment,
PAGE_SIZE);
+ *alloc_pages = alloc_size / PAGE_SIZE;
efi_status = gBS->AllocatePages(AllocateAnyPages, EfiLoaderCode,
- alloc_size / PAGE_SIZE, &alloc_address);
+ *alloc_pages, alloc_address);
if (EFI_ERROR(efi_status)) {
perror(L"Failed to allocate image buffer\n");
return EFI_OUT_OF_RESOURCES;
}
- buffer = (void *)ALIGN_VALUE((unsigned long)alloc_address, alignment);
+ buffer = (void *)ALIGN_VALUE((unsigned long)*alloc_address, alignment);
CopyMem(buffer, data, context.SizeOfHeaders);
*entry_point = ImageAddress(buffer, context.ImageSize, context.EntryPoint);
if (!*entry_point) {
perror(L"Entry point is invalid\n");
- gBS->FreePages(alloc_address, alloc_size / PAGE_SIZE);
+ gBS->FreePages(*alloc_address, *alloc_pages);
return EFI_UNSUPPORTED;
}
@@ -1342,7 +1344,7 @@ static EFI_STATUS handle_image (void *data, unsigned int datasize,
if (end < base) {
perror(L"Section %d has negative size\n", i);
- gBS->FreePages(alloc_address, alloc_size / PAGE_SIZE);
+ gBS->FreePages(*alloc_address, *alloc_pages);
return EFI_UNSUPPORTED;
}
@@ -1811,6 +1813,8 @@ EFI_STATUS start_image(EFI_HANDLE image_handle, CHAR16 *ImagePath)
EFI_STATUS efi_status;
EFI_LOADED_IMAGE *li, li_bak;
EFI_IMAGE_ENTRY_POINT entry_point;
+ EFI_PHYSICAL_ADDRESS alloc_address;
+ UINTN alloc_pages;
CHAR16 *PathName = NULL;
void *sourcebuffer = NULL;
UINT64 sourcesize = 0;
@@ -1894,7 +1898,8 @@ EFI_STATUS start_image(EFI_HANDLE image_handle, CHAR16 *ImagePath)
/*
* Verify and, if appropriate, relocate and execute the executable
*/
- efi_status = handle_image(data, datasize, li, &entry_point);
+ efi_status = handle_image(data, datasize, li, &entry_point,
+ &alloc_address, &alloc_pages);
if (EFI_ERROR(efi_status)) {
perror(L"Failed to load image: %r\n", efi_status);
PrintErrors();