summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorINDIA\sachinganesh <sachinganesh@ami.com>2025-01-23 18:35:35 +0530
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2025-01-26 17:15:56 +0000
commit6278bbb89822c598fcd0637ae74174e367895c84 (patch)
tree3d085d9add178ed4c74611e074937f4c3f792abd
parentaedcaa3df8a246ef859c234ed5c243471c5be698 (diff)
downloadedk2-6278bbb89822c598fcd0637ae74174e367895c84.tar.gz
MdePkg: Use SafeIntLib to handle overflow
Used SafeIntLib to handle the overflow check in PeCoffLoaderRelocateImage Signed-off-by: Sachin Ganesh <sachinganesh@ami.com>
-rw-r--r--MdePkg/Library/BasePeCoffLib/BasePeCoff.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c
index e45980d529..ccb963407e 100644
--- a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c
+++ b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c
@@ -976,6 +976,7 @@ PeCoffLoaderRelocateImage (
PHYSICAL_ADDRESS BaseAddress;
UINT32 NumberOfRvaAndSizes;
UINT32 TeStrippedOffset;
+ UINT32 EndAddress;
ASSERT (ImageContext != NULL);
@@ -1055,15 +1056,20 @@ PeCoffLoaderRelocateImage (
RelocDir = &Hdr.Te->DataDirectory[0];
}
- if ((RelocDir != NULL) && (RelocDir->Size > 0) && ((RelocDir->Size - 1) < (MAX_UINT32 - RelocDir->VirtualAddress))) {
- RelocBase = (EFI_IMAGE_BASE_RELOCATION *)PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress, TeStrippedOffset);
- RelocBaseEnd = (EFI_IMAGE_BASE_RELOCATION *)PeCoffLoaderImageAddress (
- ImageContext,
- RelocDir->VirtualAddress + RelocDir->Size - 1,
- TeStrippedOffset
- );
+ if ((RelocDir != NULL) && (RelocDir->Size > 0)) {
+ Status = SafeUint32Add (RelocDir->VirtualAddress, (RelocDir->Size - 1), &EndAddress);
+ if (!RETURN_ERROR (Status)) {
+ RelocBase = (EFI_IMAGE_BASE_RELOCATION *)PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress, TeStrippedOffset);
+ RelocBaseEnd = (EFI_IMAGE_BASE_RELOCATION *)PeCoffLoaderImageAddress (
+ ImageContext,
+ EndAddress,
+ TeStrippedOffset
+ );
+ }
+
if ((RelocBase == NULL) || (RelocBaseEnd == NULL) || ((UINTN)RelocBaseEnd < (UINTN)RelocBase)) {
ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
+ DEBUG ((DEBUG_ERROR, "Relocation block is not valid\n"));
return RETURN_LOAD_ERROR;
}
} else {