|
|
4210fa |
From a876037a0d4b91638fcb6274bd7a976f8318a7e2 Mon Sep 17 00:00:00 2001
|
|
|
4210fa |
From: Peter Jones <pjones@redhat.com>
|
|
|
4210fa |
Date: Fri, 11 Apr 2014 15:05:24 -0400
|
|
|
4210fa |
Subject: [PATCH 24/74] Kees' patch missed the offset adjustment to PEHdr.
|
|
|
4210fa |
|
|
|
4210fa |
In read_header, we adjust context->PEHdr's address by doshdr->e_lfanew.
|
|
|
4210fa |
If we're going to recompute that address, we have to adjust it here
|
|
|
4210fa |
too.
|
|
|
4210fa |
|
|
|
4210fa |
Signed-off-by: Peter Jones <pjones@redhat.com>
|
|
|
4210fa |
---
|
|
|
4210fa |
shim.c | 26 +++++++++++++++++++-------
|
|
|
4210fa |
1 file changed, 19 insertions(+), 7 deletions(-)
|
|
|
4210fa |
|
|
|
4210fa |
diff --git a/shim.c b/shim.c
|
|
|
4210fa |
index 8c583a4..d06bd02 100644
|
|
|
4210fa |
--- a/shim.c
|
|
|
4210fa |
+++ b/shim.c
|
|
|
4210fa |
@@ -511,12 +511,8 @@ static EFI_STATUS generate_hash (char *data, int datasize_in,
|
|
|
4210fa |
EFI_IMAGE_SECTION_HEADER *SectionHeader = NULL;
|
|
|
4210fa |
EFI_IMAGE_SECTION_HEADER *SectionCache;
|
|
|
4210fa |
EFI_STATUS status = EFI_SUCCESS;
|
|
|
4210fa |
-
|
|
|
4210fa |
- sha256ctxsize = Sha256GetContextSize();
|
|
|
4210fa |
- sha256ctx = AllocatePool(sha256ctxsize);
|
|
|
4210fa |
-
|
|
|
4210fa |
- sha1ctxsize = Sha1GetContextSize();
|
|
|
4210fa |
- sha1ctx = AllocatePool(sha1ctxsize);
|
|
|
4210fa |
+ EFI_IMAGE_DOS_HEADER *DosHdr = (void *)data;
|
|
|
4210fa |
+ unsigned int PEHdr_offset = 0;
|
|
|
4210fa |
|
|
|
4210fa |
if (datasize_in < 0) {
|
|
|
4210fa |
Print(L"Invalid data size\n");
|
|
|
4210fa |
@@ -524,6 +520,19 @@ static EFI_STATUS generate_hash (char *data, int datasize_in,
|
|
|
4210fa |
}
|
|
|
4210fa |
size = datasize = (unsigned int)datasize_in;
|
|
|
4210fa |
|
|
|
4210fa |
+ if (datasize <= sizeof (*DosHdr) ||
|
|
|
4210fa |
+ DosHdr->e_magic != EFI_IMAGE_DOS_SIGNATURE) {
|
|
|
4210fa |
+ Print(L"Invalid signature\n");
|
|
|
4210fa |
+ return EFI_INVALID_PARAMETER;
|
|
|
4210fa |
+ }
|
|
|
4210fa |
+ PEHdr_offset = DosHdr->e_lfanew;
|
|
|
4210fa |
+
|
|
|
4210fa |
+ sha256ctxsize = Sha256GetContextSize();
|
|
|
4210fa |
+ sha256ctx = AllocatePool(sha256ctxsize);
|
|
|
4210fa |
+
|
|
|
4210fa |
+ sha1ctxsize = Sha1GetContextSize();
|
|
|
4210fa |
+ sha1ctx = AllocatePool(sha1ctxsize);
|
|
|
4210fa |
+
|
|
|
4210fa |
if (!sha256ctx || !sha1ctx) {
|
|
|
4210fa |
Print(L"Unable to allocate memory for hash context\n");
|
|
|
4210fa |
return EFI_OUT_OF_RESOURCES;
|
|
|
4210fa |
@@ -590,6 +599,7 @@ static EFI_STATUS generate_hash (char *data, int datasize_in,
|
|
|
4210fa |
|
|
|
4210fa |
/* Validate SectionPtr is within image */
|
|
|
4210fa |
SectionPtr = ImageAddress(data, datasize,
|
|
|
4210fa |
+ PEHdr_offset +
|
|
|
4210fa |
sizeof (UINT32) +
|
|
|
4210fa |
sizeof (EFI_IMAGE_FILE_HEADER) +
|
|
|
4210fa |
context->PEHdr->Pe32.FileHeader.SizeOfOptionalHeader +
|
|
|
4210fa |
@@ -617,7 +627,9 @@ static EFI_STATUS generate_hash (char *data, int datasize_in,
|
|
|
4210fa |
}
|
|
|
4210fa |
|
|
|
4210fa |
/* Already validated above */
|
|
|
4210fa |
- Section = ImageAddress(data, datasize, sizeof (UINT32) +
|
|
|
4210fa |
+ Section = ImageAddress(data, datasize,
|
|
|
4210fa |
+ PEHdr_offset +
|
|
|
4210fa |
+ sizeof (UINT32) +
|
|
|
4210fa |
sizeof (EFI_IMAGE_FILE_HEADER) +
|
|
|
4210fa |
context->PEHdr->Pe32.FileHeader.SizeOfOptionalHeader);
|
|
|
4210fa |
|
|
|
4210fa |
--
|
|
|
4210fa |
1.9.3
|
|
|
4210fa |
|