Explorar o código

[IA64] bugfix stack layout upside-down

ia64 expects following vm layout:

== low memory
[register-stack grows up]
[memory-stack grows down]
== high memory

But the code assigns the base of the register stack at the
maximum stack size offset from the fixed address where the
stack *might* start.  Stack randomization will result in the
memory stack starting at a lower address than this, and if the
user has set a low stack limit with "ulimit -s", then you can
end up with the register stack above the memory stack (or if
you were very unlucky right on top of it!).

Fix: Calculate the base address for the register stack starting
from the actual address of the memory stack.

Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
KAMEZAWA Hiroyuki %!s(int64=18) %!d(string=hai) anos
pai
achega
83d2cd3de4
Modificáronse 1 ficheiros con 1 adicións e 1 borrados
  1. 1 1
      arch/ia64/mm/init.c

+ 1 - 1
arch/ia64/mm/init.c

@@ -155,7 +155,7 @@ ia64_set_rbs_bot (void)
 
 
 	if (stack_size > MAX_USER_STACK_SIZE)
 	if (stack_size > MAX_USER_STACK_SIZE)
 		stack_size = MAX_USER_STACK_SIZE;
 		stack_size = MAX_USER_STACK_SIZE;
-	current->thread.rbs_bot = STACK_TOP - stack_size;
+	current->thread.rbs_bot = PAGE_ALIGN(current->mm->start_stack - stack_size);
 }
 }
 
 
 /*
 /*