mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/Core: fix feature conflict between NX and NULL detection
If enabled, NX memory protection feature will mark all free memory as NX (non-executable), including page 0. This will overwrite the attributes of page 0 if NULL pointer detection feature is also enabled and then compromise the functionality of it. The solution is skipping the NX attributes setting to page 0 if NULL pointer detection feature is enabled. Cc: Star Zeng <star.zeng@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jian J Wang <jian.j.wang@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
parent
1263ecf2ff
commit
9b17c6511d
|
@ -845,10 +845,24 @@ InitializeDxeNxMemoryProtectionPolicy (
|
||||||
|
|
||||||
Attributes = GetPermissionAttributeForMemoryType (MemoryMapEntry->Type);
|
Attributes = GetPermissionAttributeForMemoryType (MemoryMapEntry->Type);
|
||||||
if (Attributes != 0) {
|
if (Attributes != 0) {
|
||||||
SetUefiImageMemoryAttributes (
|
if (MemoryMapEntry->PhysicalStart == 0 &&
|
||||||
MemoryMapEntry->PhysicalStart,
|
PcdGet8 (PcdNullPointerDetectionPropertyMask) != 0) {
|
||||||
LShiftU64 (MemoryMapEntry->NumberOfPages, EFI_PAGE_SHIFT),
|
|
||||||
Attributes);
|
ASSERT (MemoryMapEntry->NumberOfPages > 0);
|
||||||
|
//
|
||||||
|
// Skip page 0 if NULL pointer detection is enabled to avoid attributes
|
||||||
|
// overwritten.
|
||||||
|
//
|
||||||
|
SetUefiImageMemoryAttributes (
|
||||||
|
MemoryMapEntry->PhysicalStart + EFI_PAGE_SIZE,
|
||||||
|
LShiftU64 (MemoryMapEntry->NumberOfPages - 1, EFI_PAGE_SHIFT),
|
||||||
|
Attributes);
|
||||||
|
} else {
|
||||||
|
SetUefiImageMemoryAttributes (
|
||||||
|
MemoryMapEntry->PhysicalStart,
|
||||||
|
LShiftU64 (MemoryMapEntry->NumberOfPages, EFI_PAGE_SHIFT),
|
||||||
|
Attributes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
|
MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue