mirror of https://github.com/acidanthera/audk.git
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:
parent
14e8137c82
commit
49d8f534cc
|
@ -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 {
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue