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/includ... ============================================================================== --- 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/inifil... ============================================================================== --- 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/hea... ============================================================================== --- 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)))