Author: tkreuzer
Date: Mon Apr 12 21:39:50 2010
New Revision: 46849
URL: http://svn.reactos.org/svn/reactos?rev=46849&view=rev
Log:
[HAL]
Fix a possible overflow of the hal heap in HalpMapPhysicalMemory64 and simplify the code.
Modified:
trunk/reactos/hal/halx86/generic/halinit.c
Modified: trunk/reactos/hal/halx86/generic/halinit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/halinit…
==============================================================================
--- trunk/reactos/hal/halx86/generic/halinit.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/halinit.c [iso-8859-1] Mon Apr 12 21:39:50 2010
@@ -145,33 +145,31 @@
/* Start at the current HAL heap base */
BaseAddress = HalpHeapStart;
+ VirtualAddress = BaseAddress;
/* Loop until we have all the pages required */
while (UsedPages < PageCount)
{
- /* Begin a new loop cycle */
- UsedPages = 0;
- VirtualAddress = BaseAddress;
-
/* If this overflows past the HAL heap, it means there's no space */
- if (BaseAddress == NULL) return NULL;
-
- /* Loop until we have all the pages required in a single run */
- while (UsedPages < PageCount)
- {
- /* Get the PTE for this address and check if it's available */
- PointerPte = HalAddressToPte(VirtualAddress);
- if (*(PULONG)PointerPte)
- {
- /* PTE has data, skip it and start with a new base address */
- BaseAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE);
- break;
- }
-
- /* PTE is available, keep going on this run */
- VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE);
- UsedPages++;
- }
+ if (VirtualAddress == NULL) return NULL;
+
+ /* Get the PTE for this address */
+ PointerPte = HalAddressToPte(VirtualAddress);
+
+ /* Go to the next page */
+ VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE);
+
+ /* Check if the page is available */
+ if (PointerPte->Valid)
+ {
+ /* PTE has data, skip it and start with a new base address */
+ BaseAddress = VirtualAddress;
+ UsedPages = 0;
+ continue;
+ }
+
+ /* PTE is available, keep going on this run */
+ UsedPages++;
}
/* Take the base address of the page plus the actual offset in the address */