Author: tkreuzer
Date: Mon Feb 18 20:09:50 2013
New Revision: 58341
URL:
http://svn.reactos.org/svn/reactos?rev=58341&view=rev
Log:
[FREELDR]
Implement HeapVerify(), fix a buffer overrun.
CORE-6893 #resolve
Modified:
trunk/reactos/boot/freeldr/freeldr/include/mm.h
trunk/reactos/boot/freeldr/freeldr/inifile/inifile.c
trunk/reactos/boot/freeldr/freeldr/mm/heap.c
Modified: trunk/reactos/boot/freeldr/freeldr/include/mm.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inclu…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/include/mm.h [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/include/mm.h [iso-8859-1] Mon Feb 18 20:09:50 2013
@@ -133,6 +133,10 @@
PVOID HeapHandle);
VOID
+HeapVerify(
+ PVOID HeapHandle);
+
+VOID
HeapCleanupAll(VOID);
PVOID
Modified: trunk/reactos/boot/freeldr/freeldr/inifile/inifile.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inifi…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/inifile/inifile.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/inifile/inifile.c [iso-8859-1] Mon Feb 18 20:09:50
2013
@@ -190,7 +190,7 @@
RtlZeroMemory(Section, sizeof(INI_SECTION));
// Allocate the section name buffer
- Section->SectionName = MmHeapAlloc(strlen(SectionName));
+ Section->SectionName = MmHeapAlloc(strlen(SectionName) + sizeof(CHAR));
if (!Section->SectionName)
{
MmHeapFree(Section);
Modified: trunk/reactos/boot/freeldr/freeldr/mm/heap.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/mm/he…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/mm/heap.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/mm/heap.c [iso-8859-1] Mon Feb 18 20:09:50 2013
@@ -149,6 +149,32 @@
LoaderFirmwareTemporary);
}
+#ifdef FREELDR_HEAP_VERIFIER
+VOID
+HeapVerify(
+ PVOID HeapHandle)
+{
+ PHEAP Heap = HeapHandle;
+ PHEAP_BLOCK Block;
+
+ /* Loop all heap chunks */
+ for (Block = &Heap->Blocks;
+ Block->Size != 0;
+ Block = Block + 1 + Block->Size)
+ {
+ /* Continue, if its not free */
+ if (Block->Tag != 0)
+ {
+ /* Verify size and redzones */
+ ASSERT(*REDZONE_SIZE(Block) <= Block->Size * sizeof(HEAP_BLOCK));
+ ASSERT(*REDZONE_LOW(Block) == REDZONE_MARK);
+ ASSERT(*REDZONE_HI(Block) == REDZONE_MARK);
+ continue;
+ }
+ }
+}
+#endif /* FREELDR_HEAP_VERIFIER */
+
VOID
HeapRelease(
PVOID HeapHandle)
@@ -296,6 +322,9 @@
ULONGLONG Time = __rdtsc();
#ifdef FREELDR_HEAP_VERIFIER
+ /* Verify the heap */
+ HeapVerify(HeapHandle);
+
/* Add space for a size field and 2 redzones */
ByteSize += REDZONE_ALLOCATION;
#endif
@@ -408,6 +437,11 @@
TRACE("HeapFree(%p, %p)\n", HeapHandle, Pointer);
ASSERT(Tag != 'dnE#');
+#ifdef FREELDR_HEAP_VERIFIER
+ /* Verify the heap */
+ HeapVerify(HeapHandle);
+#endif
+
/* Check if the block is really inside this heap */
if ((Pointer < (PVOID)(Heap + 1)) ||
(Pointer > (PVOID)((PUCHAR)Heap + Heap->MaximumSize)))