|
Lines 309-315
static int
Link Here
|
| 309 |
image_is_64_bit(EFI_IMAGE_OPTIONAL_HEADER_UNION *PEHdr) |
309 |
image_is_64_bit(EFI_IMAGE_OPTIONAL_HEADER_UNION *PEHdr) |
| 310 |
{ |
310 |
{ |
| 311 |
/* .Magic is the same offset in all cases */ |
311 |
/* .Magic is the same offset in all cases */ |
| 312 |
if (PEHdr->Pe32Plus.OptionalHeader.Magic |
312 |
if (PEHdr->Pe32.OptionalHeader.Magic |
| 313 |
== EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) |
313 |
== EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) |
| 314 |
return 1; |
314 |
return 1; |
| 315 |
return 0; |
315 |
return 0; |
|
Lines 375-388
read_header(void *data, unsigned int datasize,
Link Here
|
| 375 |
unsigned long HeaderWithoutDataDir, SectionHeaderOffset, OptHeaderSize; |
375 |
unsigned long HeaderWithoutDataDir, SectionHeaderOffset, OptHeaderSize; |
| 376 |
unsigned long FileAlignment = 0; |
376 |
unsigned long FileAlignment = 0; |
| 377 |
UINT16 DllFlags; |
377 |
UINT16 DllFlags; |
|
|
378 |
size_t dos_sz = 0; |
| 378 |
|
379 |
|
| 379 |
if (datasize < sizeof (PEHdr->Pe32)) { |
380 |
if (datasize < sizeof (*DosHdr)) { |
| 380 |
perror(L"Invalid image\n"); |
381 |
perror(L"Invalid image\n"); |
| 381 |
return EFI_UNSUPPORTED; |
382 |
return EFI_UNSUPPORTED; |
| 382 |
} |
383 |
} |
| 383 |
|
384 |
|
| 384 |
if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) |
385 |
if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) { |
|
|
386 |
if (DosHdr->e_lfanew < sizeof (*DosHdr) || |
| 387 |
DosHdr->e_lfanew > datasize - 4) { |
| 388 |
perror(L"Invalid image\n"); |
| 389 |
return EFI_UNSUPPORTED; |
| 390 |
} |
| 391 |
|
| 392 |
dos_sz = DosHdr->e_lfanew; |
| 385 |
PEHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)((char *)data + DosHdr->e_lfanew); |
393 |
PEHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)((char *)data + DosHdr->e_lfanew); |
|
|
394 |
} |
| 395 |
|
| 396 |
if (datasize - dos_sz < sizeof (PEHdr->Pe32)) { |
| 397 |
perror(L"Invalid image\n"); |
| 398 |
return EFI_UNSUPPORTED; |
| 399 |
} |
| 400 |
|
| 401 |
if (image_is_64_bit(PEHdr) && |
| 402 |
(datasize - dos_sz < sizeof (PEHdr->Pe32Plus))) { |
| 403 |
perror(L"Invalid image\n"); |
| 404 |
return EFI_UNSUPPORTED; |
| 405 |
} |
| 386 |
|
406 |
|
| 387 |
if (!image_is_loadable(PEHdr)) { |
407 |
if (!image_is_loadable(PEHdr)) { |
| 388 |
perror(L"Platform does not support this image\n"); |
408 |
perror(L"Platform does not support this image\n"); |
| 389 |
- |
|
|