diff options
| author | Peter Jones <pjones@redhat.com> | 2013-10-03 17:04:30 -0400 |
|---|---|---|
| committer | Peter Jones <pjones@redhat.com> | 2013-10-03 17:04:45 -0400 |
| commit | 8c46e07fec170f87a0ab3d9091933cf128258fab (patch) | |
| tree | b1106ef6fd46c7236dd6cb3345efb41737e63f03 | |
| parent | fc986307fb200fdf493b9dd083ad39ae3561b0c9 (diff) | |
| download | efi-boot-shim-8c46e07fec170f87a0ab3d9091933cf128258fab.tar.gz efi-boot-shim-8c46e07fec170f87a0ab3d9091933cf128258fab.zip | |
Improve PE image bounds checking.
Signed-off-by: Peter Jones <pjones@redhat.com>
| -rw-r--r-- | shim.c | 10 |
1 files changed, 9 insertions, 1 deletions
@@ -144,10 +144,18 @@ static EFI_STATUS relocate_coff (PE_COFF_LOADER_IMAGE_CONTEXT *context, Adjust = (UINT64)data - context->ImageAddress; + if (Adjust == 0) + return EFI_SUCCESS; + while (RelocBase < RelocBaseEnd) { Reloc = (UINT16 *) ((char *) RelocBase + sizeof (EFI_IMAGE_BASE_RELOCATION)); - RelocEnd = (UINT16 *) ((char *) RelocBase + RelocBase->SizeOfBlock); + if ((RelocBase->SizeOfBlock == 0) || (RelocBase->SizeOfBlock > context->RelocDir->Size)) { + Print(L"Reloc block size is invalid\n"); + return EFI_UNSUPPORTED; + } + + RelocEnd = (UINT16 *) ((char *) RelocBase + RelocBase->SizeOfBlock); if ((void *)RelocEnd < data || (void *)RelocEnd > ImageEnd) { Print(L"Reloc entry overflows binary\n"); return EFI_UNSUPPORTED; |
