BaseTools/PeCoffLib: Check 'RelocDir' before finding relocation block

To match the code logics in MdePkg/Library/BasePeCoffLib, add checks for
'RelocDir' before finding the relocation block.

Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hao Wu <hao.a.wu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Hao Wu 2016-11-09 12:06:29 +08:00
parent 14e8137c82
commit 49d8f534cc
1 changed files with 30 additions and 16 deletions

View File

@ -645,14 +645,21 @@ Returns:
// //
if (OptionHeader.Optional32->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) { if (OptionHeader.Optional32->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {
RelocDir = &OptionHeader.Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC]; RelocDir = &OptionHeader.Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];
RelocBase = PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress); if ((RelocDir != NULL) && (RelocDir->Size > 0)) {
RelocBaseEnd = PeCoffLoaderImageAddress ( RelocBase = PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress);
ImageContext, RelocBaseEnd = PeCoffLoaderImageAddress (
RelocDir->VirtualAddress + RelocDir->Size - 1 ImageContext,
); RelocDir->VirtualAddress + RelocDir->Size - 1
if (RelocBase == NULL || RelocBaseEnd == NULL || RelocBaseEnd < RelocBase) { );
ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION; if (RelocBase == NULL || RelocBaseEnd == NULL || RelocBaseEnd < RelocBase) {
return RETURN_LOAD_ERROR; ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
return RETURN_LOAD_ERROR;
}
} else {
//
// Set base and end to bypass processing below.
//
RelocBase = RelocBaseEnd = 0;
} }
} else { } else {
// //
@ -673,14 +680,21 @@ Returns:
// //
if (OptionHeader.Optional64->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) { if (OptionHeader.Optional64->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {
RelocDir = &OptionHeader.Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC]; RelocDir = &OptionHeader.Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];
RelocBase = PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress); if ((RelocDir != NULL) && (RelocDir->Size > 0)) {
RelocBaseEnd = PeCoffLoaderImageAddress ( RelocBase = PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress);
ImageContext, RelocBaseEnd = PeCoffLoaderImageAddress (
RelocDir->VirtualAddress + RelocDir->Size - 1 ImageContext,
); RelocDir->VirtualAddress + RelocDir->Size - 1
if (RelocBase == NULL || RelocBaseEnd == NULL || RelocBaseEnd < RelocBase) { );
ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION; if (RelocBase == NULL || RelocBaseEnd == NULL || RelocBaseEnd < RelocBase) {
return RETURN_LOAD_ERROR; ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
return RETURN_LOAD_ERROR;
}
} else {
//
// Set base and end to bypass processing below.
//
RelocBase = RelocBaseEnd = 0;
} }
} else { } else {
// //