mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 05:02:12 +00:00
x86 setup: guard the heap against invalid stack setups
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>
This commit is contained in:
parent
1a8514e04e
commit
acd644bb4a
@ -100,20 +100,32 @@ static void set_bios_mode(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void init_heap(void)
|
||||
{
|
||||
char *stack_end;
|
||||
|
||||
if (boot_params.hdr.loadflags & CAN_USE_HEAP) {
|
||||
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 */
|
||||
if (boot_params.hdr.loadflags & CAN_USE_HEAP) {
|
||||
heap_end = (char *)(boot_params.hdr.heap_end_ptr
|
||||
+0x200-STACK_SIZE);
|
||||
} else {
|
||||
/* Boot protocol 2.00 only, no heap available */
|
||||
puts("WARNING: Ancient bootloader, some functionality "
|
||||
"may be limited!\n");
|
||||
}
|
||||
init_heap();
|
||||
|
||||
/* Make sure we have all the proper CPU support */
|
||||
if (validate_cpu()) {
|
||||
|
Loading…
Reference in New Issue
Block a user