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:
		@@ -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 {
 | 
				
			||||||
        //
 | 
					        //
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user