Skip to content

Commit

Permalink
x86 setup: guard the heap against invalid stack setups
Browse files Browse the repository at this point in the history
If we use the bootloader-provided stack pointer, we might end up in a
situation where the bootloader (incorrectly) pointed the stack in the
middle of our heap.  Catch this by simply comparing the computed heap
end value to the stack pointer minus the defined stack size.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
H. Peter Anvin authored and Ingo Molnar committed Jan 30, 2008
1 parent 1a8514e commit acd644b
Showing 1 changed file with 18 additions and 6 deletions.
24 changes: 18 additions & 6 deletions arch/x86/boot/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,20 +100,32 @@ static void set_bios_mode(void)
#endif
}

void main(void)
static void init_heap(void)
{
/* First, copy the boot header into the "zeropage" */
copy_boot_params();
char *stack_end;

/* End of heap check */
if (boot_params.hdr.loadflags & CAN_USE_HEAP) {
heap_end = (char *)(boot_params.hdr.heap_end_ptr
+0x200-STACK_SIZE);
asm("leal %P1(%%esp),%0"
: "=r" (stack_end) : "i" (-STACK_SIZE));

heap_end = (char *)
((size_t)boot_params.hdr.heap_end_ptr + 0x200);
if (heap_end > stack_end)
heap_end = stack_end;
} else {
/* Boot protocol 2.00 only, no heap available */
puts("WARNING: Ancient bootloader, some functionality "
"may be limited!\n");
}
}

void main(void)
{
/* First, copy the boot header into the "zeropage" */
copy_boot_params();

/* End of heap check */
init_heap();

/* Make sure we have all the proper CPU support */
if (validate_cpu()) {
Expand Down

0 comments on commit acd644b

Please sign in to comment.