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,6 +645,7 @@ 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];
 | 
				
			||||||
 | 
					        if ((RelocDir != NULL) && (RelocDir->Size > 0)) {
 | 
				
			||||||
          RelocBase = PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress);
 | 
					          RelocBase = PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress);
 | 
				
			||||||
          RelocBaseEnd = PeCoffLoaderImageAddress (
 | 
					          RelocBaseEnd = PeCoffLoaderImageAddress (
 | 
				
			||||||
                           ImageContext,
 | 
					                           ImageContext,
 | 
				
			||||||
@@ -660,6 +661,12 @@ Returns:
 | 
				
			|||||||
          //
 | 
					          //
 | 
				
			||||||
          RelocBase = RelocBaseEnd = 0;
 | 
					          RelocBase = RelocBaseEnd = 0;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        // Set base and end to bypass processing below.
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        RelocBase = RelocBaseEnd = 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      Adjust = (UINT64) BaseAddress - OptionHeader.Optional64->ImageBase;
 | 
					      Adjust = (UINT64) BaseAddress - OptionHeader.Optional64->ImageBase;
 | 
				
			||||||
      OptionHeader.Optional64->ImageBase = BaseAddress;
 | 
					      OptionHeader.Optional64->ImageBase = BaseAddress;
 | 
				
			||||||
@@ -673,6 +680,7 @@ 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];
 | 
				
			||||||
 | 
					        if ((RelocDir != NULL) && (RelocDir->Size > 0)) {
 | 
				
			||||||
          RelocBase = PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress);
 | 
					          RelocBase = PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress);
 | 
				
			||||||
          RelocBaseEnd = PeCoffLoaderImageAddress (
 | 
					          RelocBaseEnd = PeCoffLoaderImageAddress (
 | 
				
			||||||
                           ImageContext,
 | 
					                           ImageContext,
 | 
				
			||||||
@@ -688,6 +696,12 @@ Returns:
 | 
				
			|||||||
          //
 | 
					          //
 | 
				
			||||||
          RelocBase = RelocBaseEnd = 0;
 | 
					          RelocBase = RelocBaseEnd = 0;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        // Set base and end to bypass processing below.
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        RelocBase = RelocBaseEnd = 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    TeHdr             = (EFI_TE_IMAGE_HEADER *) (UINTN) (ImageContext->ImageAddress);
 | 
					    TeHdr             = (EFI_TE_IMAGE_HEADER *) (UINTN) (ImageContext->ImageAddress);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user