pe_kernel_info() returned AddressOfEntryPoint (and the .compat section
entry_point) straight from the PE header with no check against
SizeOfImage. Since
cab9c7b5a4 the stub calls the inner kernel directly
as ImageBase + entry_point, and only EFI_SIZE_TO_PAGES(SizeOfImage) pages
are allocated for it.
Follow-up for
cab9c7b5a42effa8a45611fc6b8556138c869b5f
return EFI_UNSUPPORTED;
if (pe->FileHeader.Machine == TARGET_MACHINE_TYPE) {
+ /* The entry point is later called as ImageBase + entry_point, and only SizeOfImage
+ * bytes are allocated for the image, so reject an entry point outside of it. */
+ if (pe->OptionalHeader.AddressOfEntryPoint >= size_in_memory)
+ return EFI_LOAD_ERROR;
if (ret_entry_point)
*ret_entry_point = pe->OptionalHeader.AddressOfEntryPoint;
if (ret_compat_entry_point)
if (compat_entry_point == 0)
/* Image type not supported and no compat entry found. */
return EFI_UNSUPPORTED;
+ if (compat_entry_point >= size_in_memory)
+ /* Same as above: the compat entry point is called as ImageBase + entry_point. */
+ return EFI_LOAD_ERROR;
if (ret_entry_point)
*ret_entry_point = 0;