ARM: stack protector: change the canary value per task
authorNicolas Pitre <nico@fluxnic.net>
Tue, 8 Jun 2010 01:50:33 +0000 (21:50 -0400)
committerNicolas Pitre <nico@fluxnic.net>
Tue, 15 Jun 2010 01:31:01 +0000 (21:31 -0400)
commitdf0698be14c6683606d5df2d83e3ae40f85ed0d9
treefa0a2c08509d88e74d7033fa922f1cdfef83290f
parentc743f38013aeff58ef6252601e397b5ba281c633
ARM: stack protector: change the canary value per task

A new random value for the canary is stored in the task struct whenever
a new task is forked.  This is meant to allow for different canary values
per task.  On ARM, GCC expects the canary value to be found in a global
variable called __stack_chk_guard.  So this variable has to be updated
with the value stored in the task struct whenever a task switch occurs.

Because the variable GCC expects is global, this cannot work on SMP
unfortunately.  So, on SMP, the same initial canary value is kept
throughout, making this feature a bit less effective although it is still
useful.

One way to overcome this GCC limitation would be to locate the
__stack_chk_guard variable into a memory page of its own for each CPU,
and then use TLB locking to have each CPU see its own page at the same
virtual address for each of them.

Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
arch/arm/kernel/asm-offsets.c
arch/arm/kernel/entry-armv.S