]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/PiSmmCore/Page.c
MdeModulePkg/PiSmmCore: Check valid memory range.
[mirror_edk2.git] / MdeModulePkg / Core / PiSmmCore / Page.c
index cd7d7ece0ceedf8cfa59b90d6f011d177dd5ab8c..25f72d309b3adee1b8bb848a03baa850b066c74f 100644 (file)
@@ -862,6 +862,41 @@ SmmInternalFreePages (
   return SmmInternalFreePagesEx (Memory, NumberOfPages, FALSE);\r
 }\r
 \r
+/**\r
+  Check whether the input range is in memory map.\r
+\r
+  @param  Memory                 Base address of memory being inputed.\r
+  @param  NumberOfPages          The number of pages.\r
+\r
+  @retval TRUE   In memory map.\r
+  @retval FALSE  Not in memory map.\r
+\r
+**/\r
+BOOLEAN\r
+InMemMap (\r
+  IN EFI_PHYSICAL_ADDRESS  Memory,\r
+  IN UINTN                 NumberOfPages\r
+  )\r
+{\r
+  LIST_ENTRY               *Link;\r
+  MEMORY_MAP               *Entry;\r
+  EFI_PHYSICAL_ADDRESS     Last;\r
+\r
+  Last = Memory + EFI_PAGES_TO_SIZE (NumberOfPages) - 1;\r
+\r
+  Link = gMemoryMap.ForwardLink;\r
+  while (Link != &gMemoryMap) {\r
+    Entry = CR (Link, MEMORY_MAP, Link, MEMORY_MAP_SIGNATURE);\r
+    Link  = Link->ForwardLink;\r
+\r
+    if ((Entry->Start <= Memory) && (Entry->End >= Last)) {\r
+      return TRUE;\r
+    }\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
 /**\r
   Frees previous allocated pages.\r
 \r
@@ -883,6 +918,10 @@ SmmFreePages (
   EFI_STATUS  Status;\r
   BOOLEAN     IsGuarded;\r
 \r
+  if (!InMemMap(Memory, NumberOfPages)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
   IsGuarded = IsHeapGuardEnabled () && IsMemoryGuarded (Memory);\r
   Status = SmmInternalFreePages (Memory, NumberOfPages, IsGuarded);\r
   if (!EFI_ERROR (Status)) {\r