Add check for the validity of resource directory address.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8164 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qhuang8 2009-04-23 12:14:55 +00:00
parent 55a1bb43aa
commit 50cd68dfb5
1 changed files with 31 additions and 31 deletions

View File

@ -67,7 +67,7 @@ PeCoffLoaderGetPeHeader (
UINT16 Magic; UINT16 Magic;
// //
// Read the DOS image header to check for it's existance // Read the DOS image header to check for its existence
// //
Size = sizeof (EFI_IMAGE_DOS_HEADER); Size = sizeof (EFI_IMAGE_DOS_HEADER);
Status = ImageContext->ImageRead ( Status = ImageContext->ImageRead (
@ -1169,49 +1169,49 @@ PeCoffLoaderLoadImage (
if (DirectoryEntry->Size != 0) { if (DirectoryEntry->Size != 0) {
Base = PeCoffLoaderImageAddress (ImageContext, DirectoryEntry->VirtualAddress); Base = PeCoffLoaderImageAddress (ImageContext, DirectoryEntry->VirtualAddress);
if (Base != NULL) {
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) Base;
ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) Base; for (Index = 0; Index < ResourceDirectory->NumberOfNamedEntries; Index++) {
ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1); if (ResourceDirectoryEntry->u1.s.NameIsString) {
ResourceDirectoryString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *) (Base + ResourceDirectoryEntry->u1.s.NameOffset);
for (Index = 0; Index < ResourceDirectory->NumberOfNamedEntries; Index++) { if (ResourceDirectoryString->Length == 3 &&
if (ResourceDirectoryEntry->u1.s.NameIsString) { ResourceDirectoryString->String[0] == L'H' &&
ResourceDirectoryString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *) (Base + ResourceDirectoryEntry->u1.s.NameOffset); ResourceDirectoryString->String[1] == L'I' &&
ResourceDirectoryString->String[2] == L'I') {
if (ResourceDirectoryString->Length == 3 &&
ResourceDirectoryString->String[0] == L'H' &&
ResourceDirectoryString->String[1] == L'I' &&
ResourceDirectoryString->String[2] == L'I') {
//
// Resource Type "HII" found
//
if (ResourceDirectoryEntry->u2.s.DataIsDirectory) {
// //
// Move to next level - resource Name // Resource Type "HII" found
// //
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (Base + ResourceDirectoryEntry->u2.s.OffsetToDirectory);
ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);
if (ResourceDirectoryEntry->u2.s.DataIsDirectory) { if (ResourceDirectoryEntry->u2.s.DataIsDirectory) {
// //
// Move to next level - resource Language // Move to next level - resource Name
// //
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (Base + ResourceDirectoryEntry->u2.s.OffsetToDirectory); ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (Base + ResourceDirectoryEntry->u2.s.OffsetToDirectory);
ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1); ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);
if (ResourceDirectoryEntry->u2.s.DataIsDirectory) {
//
// Move to next level - resource Language
//
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (Base + ResourceDirectoryEntry->u2.s.OffsetToDirectory);
ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);
}
}
//
// Now it ought to be resource Data
//
if (!ResourceDirectoryEntry->u2.s.DataIsDirectory) {
ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *) (Base + ResourceDirectoryEntry->u2.OffsetToData);
ImageContext->HiiResourceData = (PHYSICAL_ADDRESS) (UINTN) PeCoffLoaderImageAddress (ImageContext, ResourceDataEntry->OffsetToData);
break;
} }
} }
//
// Now it ought to be resource Data
//
if (!ResourceDirectoryEntry->u2.s.DataIsDirectory) {
ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *) (Base + ResourceDirectoryEntry->u2.OffsetToData);
ImageContext->HiiResourceData = (PHYSICAL_ADDRESS) (UINTN) PeCoffLoaderImageAddress (ImageContext, ResourceDataEntry->OffsetToData);
break;
}
} }
ResourceDirectoryEntry++;
} }
ResourceDirectoryEntry++;
} }
} }
} }