Check for Type AllocateAddress,
if *Memory + size rolls over 0 or
if *Memory is above MAX_ADDRESS or
if *Memory + size of allocation is above MAX_ADDRESS,
return EFI_NOT_FOUND.

Cc: Michael Kinney <[email protected]>
Cc: Liming Gao <[email protected]>
Cc: Feng Tian <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <[email protected]>
---
 MdeModulePkg/Core/Dxe/Mem/Page.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c b/MdeModulePkg/Core/Dxe/Mem/Page.c
index 62738a187546..629ad9cb1dff 100644
--- a/MdeModulePkg/Core/Dxe/Mem/Page.c
+++ b/MdeModulePkg/Core/Dxe/Mem/Page.c
@@ -1201,6 +1201,8 @@ CoreInternalAllocatePages (
 {
   EFI_STATUS      Status;
   UINT64          Start;
+  UINT64          NumberOfBytes;
+  UINT64          End;
   UINT64          MaxAddress;
   UINTN           Alignment;
 
@@ -1246,6 +1248,25 @@ CoreInternalAllocatePages (
   //
   MaxAddress = MAX_ADDRESS;
 
+  //
+  // Check for Type AllocateAddress,
+  // if *Memory + size rolls over 0 or
+  // if *Memory is above MAX_ADDRESS or
+  // if *Memory + size of allocation is above MAX_ADDRESS,
+  // return EFI_NOT_FOUND.
+  //
+  if (Type == AllocateAddress) {
+    NumberOfBytes = LShiftU64 (NumberOfPages, EFI_PAGE_SHIFT);
+    End = Start + NumberOfBytes - 1;
+
+    if ((Start >= End) ||
+        (Start > MaxAddress) || 
+        (NumberOfBytes > (MaxAddress - Start))
+        ) {
+      return EFI_NOT_FOUND;
+    }
+  }
+
   if (Type == AllocateMaxAddress) {
     MaxAddress = Start;
   }
-- 
2.7.0.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to