mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-28 16:14:04 +02:00
MdeModulePkg: Fix buffer overflow in MergeMemoryMap
Check that the next map entry is valid before dereferencing to merge the guard pages. If the final entry is at the end of a page with no valid page following it, then this can cause an access violation. Signed-off-by: Kenneth Lautner <kenlautner3@gmail.com>
This commit is contained in:
parent
a9b38305b6
commit
964c22b8ea
@ -395,11 +395,14 @@ MergeMemoryMap (
|
|||||||
NewMemoryMapEntry = MemoryMap;
|
NewMemoryMapEntry = MemoryMap;
|
||||||
MemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)MemoryMap + *MemoryMapSize);
|
MemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)MemoryMap + *MemoryMapSize);
|
||||||
while ((UINTN)MemoryMapEntry < (UINTN)MemoryMapEnd) {
|
while ((UINTN)MemoryMapEntry < (UINTN)MemoryMapEnd) {
|
||||||
CopyMem (NewMemoryMapEntry, MemoryMapEntry, sizeof (EFI_MEMORY_DESCRIPTOR));
|
CopyMem (NewMemoryMapEntry, MemoryMapEntry, DescriptorSize);
|
||||||
NextMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
|
NextMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
MergeGuardPages (NewMemoryMapEntry, NextMemoryMapEntry->PhysicalStart);
|
if ((UINTN)NextMemoryMapEntry < (UINTN)MemoryMapEnd) {
|
||||||
|
MergeGuardPages (NewMemoryMapEntry, NextMemoryMapEntry->PhysicalStart);
|
||||||
|
}
|
||||||
|
|
||||||
MemoryBlockLength = LShiftU64 (NewMemoryMapEntry->NumberOfPages, EFI_PAGE_SHIFT);
|
MemoryBlockLength = LShiftU64 (NewMemoryMapEntry->NumberOfPages, EFI_PAGE_SHIFT);
|
||||||
if (((UINTN)NextMemoryMapEntry < (UINTN)MemoryMapEnd) &&
|
if (((UINTN)NextMemoryMapEntry < (UINTN)MemoryMapEnd) &&
|
||||||
(NewMemoryMapEntry->Type == NextMemoryMapEntry->Type) &&
|
(NewMemoryMapEntry->Type == NextMemoryMapEntry->Type) &&
|
||||||
|
Loading…
x
Reference in New Issue
Block a user