]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/PiSmmCore: Check valid memory range.
authorEric Dong <eric.dong@intel.com>
Tue, 21 Aug 2018 06:44:41 +0000 (14:44 +0800)
committerEric Dong <eric.dong@intel.com>
Tue, 28 Aug 2018 02:24:25 +0000 (10:24 +0800)
Call BS.AllocatePages in DXE driver and call SMM FreePages with the address of the buffer allocated in the DXE driver. SMM FreePages success and add a non-SMRAM range into SMM heap list. This is not an expected behavior. SMM FreePages should return error for this case and not free the pages.

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1098

Change-Id: Ie5ffa1ac62c558aa418a8a3d7d0e8158b846e13b
Cc: Star Zeng <star.zeng@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
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