mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 10:12:58 +00:00
[NTOS]: Add an extra layer of protection for freed nonpaged pool: write a 4-byte signature on freed blocks, and assert its valid on checked builds. Use a slightly less egocentric ASCII value than on Windows (name of the developer who wrote the first memory manager).
svn path=/trunk/; revision=48651
This commit is contained in:
parent
b85ab20f13
commit
c574f50663
1 changed files with 6 additions and 0 deletions
|
@ -298,6 +298,7 @@ MiInitializeNonPagedPool(VOID)
|
||||||
FreeEntry = MmNonPagedPoolStart;
|
FreeEntry = MmNonPagedPoolStart;
|
||||||
FirstEntry = FreeEntry;
|
FirstEntry = FreeEntry;
|
||||||
FreeEntry->Size = PoolPages;
|
FreeEntry->Size = PoolPages;
|
||||||
|
FreeEntry->Signature = MM_FREE_POOL_SIGNATURE;
|
||||||
FreeEntry->Owner = FirstEntry;
|
FreeEntry->Owner = FirstEntry;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -316,6 +317,7 @@ MiInitializeNonPagedPool(VOID)
|
||||||
//
|
//
|
||||||
FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)FreeEntry + PAGE_SIZE);
|
FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)FreeEntry + PAGE_SIZE);
|
||||||
FreeEntry->Owner = FirstEntry;
|
FreeEntry->Owner = FirstEntry;
|
||||||
|
FreeEntry->Signature = MM_FREE_POOL_SIGNATURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -626,6 +628,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType,
|
||||||
// Grab the entry and see if it can handle our allocation
|
// Grab the entry and see if it can handle our allocation
|
||||||
//
|
//
|
||||||
FreeEntry = CONTAINING_RECORD(NextEntry, MMFREE_POOL_ENTRY, List);
|
FreeEntry = CONTAINING_RECORD(NextEntry, MMFREE_POOL_ENTRY, List);
|
||||||
|
ASSERT(FreeEntry->Signature == MM_FREE_POOL_SIGNATURE);
|
||||||
if (FreeEntry->Size >= SizeInPages)
|
if (FreeEntry->Size >= SizeInPages)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
@ -964,6 +967,7 @@ MiFreePoolPages(IN PVOID StartingVa)
|
||||||
//
|
//
|
||||||
FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)StartingVa +
|
FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)StartingVa +
|
||||||
(NumberOfPages << PAGE_SHIFT));
|
(NumberOfPages << PAGE_SHIFT));
|
||||||
|
ASSERT(FreeEntry->Signature == MM_FREE_POOL_SIGNATURE);
|
||||||
ASSERT(FreeEntry->Owner == FreeEntry);
|
ASSERT(FreeEntry->Owner == FreeEntry);
|
||||||
|
|
||||||
/* Consume this entry's pages */
|
/* Consume this entry's pages */
|
||||||
|
@ -1032,6 +1036,7 @@ MiFreePoolPages(IN PVOID StartingVa)
|
||||||
// Get the free entry descriptor for that given page range
|
// Get the free entry descriptor for that given page range
|
||||||
//
|
//
|
||||||
FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)StartingVa - PAGE_SIZE);
|
FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)StartingVa - PAGE_SIZE);
|
||||||
|
ASSERT(FreeEntry->Signature == MM_FREE_POOL_SIGNATURE);
|
||||||
FreeEntry = FreeEntry->Owner;
|
FreeEntry = FreeEntry->Owner;
|
||||||
|
|
||||||
/* Check if protected pool is enabled */
|
/* Check if protected pool is enabled */
|
||||||
|
@ -1118,6 +1123,7 @@ MiFreePoolPages(IN PVOID StartingVa)
|
||||||
// Link back to the parent free entry, and keep going
|
// Link back to the parent free entry, and keep going
|
||||||
//
|
//
|
||||||
NextEntry->Owner = FreeEntry;
|
NextEntry->Owner = FreeEntry;
|
||||||
|
NextEntry->Signature = MM_FREE_POOL_SIGNATURE;
|
||||||
NextEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)NextEntry + PAGE_SIZE);
|
NextEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)NextEntry + PAGE_SIZE);
|
||||||
} while (NextEntry != LastEntry);
|
} while (NextEntry != LastEntry);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue