x86[_64]: Randomize initial stack pointer on alternative signal stacks
If the alternate signal stack is used randomize the initial stack pointer in the same way it is randomized on "normal" thread stacks. Also, update MINSIGSTKSZ value so that regardless of where the new stack pointer points to there is at least 4k of stack left.
This commit is contained in:
@@ -110,6 +110,15 @@ x86_set_tls_context(Thread *thread)
|
||||
}
|
||||
|
||||
|
||||
static addr_t
|
||||
arch_randomize_stack_pointer(addr_t value)
|
||||
{
|
||||
STATIC_ASSERT(MAX_RANDOM_VALUE >= B_PAGE_SIZE - 1);
|
||||
value -= random_value() & (B_PAGE_SIZE - 1);
|
||||
return value & ~addr_t(0xf);
|
||||
}
|
||||
|
||||
|
||||
static uint8*
|
||||
get_signal_stack(Thread* thread, struct iframe* frame, struct sigaction* action)
|
||||
{
|
||||
@@ -119,7 +128,8 @@ get_signal_stack(Thread* thread, struct iframe* frame, struct sigaction* action)
|
||||
&& (frame->user_sp < thread->signal_stack_base
|
||||
|| frame->user_sp >= thread->signal_stack_base
|
||||
+ thread->signal_stack_size)) {
|
||||
return (uint8*)(thread->signal_stack_base + thread->signal_stack_size);
|
||||
addr_t stackTop = thread->signal_stack_base + thread->signal_stack_size;
|
||||
return (uint8*)arch_randomize_stack_pointer(stackTop);
|
||||
}
|
||||
|
||||
return (uint8*)frame->user_sp;
|
||||
@@ -202,15 +212,6 @@ arch_thread_dump_info(void *info)
|
||||
}
|
||||
|
||||
|
||||
static addr_t
|
||||
arch_randomize_stack_pointer(addr_t value)
|
||||
{
|
||||
STATIC_ASSERT(MAX_RANDOM_VALUE >= B_PAGE_SIZE - 1);
|
||||
value -= random_value() & (B_PAGE_SIZE - 1);
|
||||
return value & ~addr_t(0xf);
|
||||
}
|
||||
|
||||
|
||||
/*! Sets up initial thread context and enters user space
|
||||
*/
|
||||
status_t
|
||||
|
||||
@@ -95,6 +95,15 @@ x86_set_tls_context(Thread* thread)
|
||||
}
|
||||
|
||||
|
||||
static addr_t
|
||||
arch_randomize_stack_pointer(addr_t value)
|
||||
{
|
||||
STATIC_ASSERT(MAX_RANDOM_VALUE >= B_PAGE_SIZE - 1);
|
||||
value -= random_value() & (B_PAGE_SIZE - 1);
|
||||
return value & ~addr_t(0xf);
|
||||
}
|
||||
|
||||
|
||||
static uint8*
|
||||
get_signal_stack(Thread* thread, iframe* frame, struct sigaction* action)
|
||||
{
|
||||
@@ -104,7 +113,8 @@ get_signal_stack(Thread* thread, iframe* frame, struct sigaction* action)
|
||||
&& (frame->user_sp < thread->signal_stack_base
|
||||
|| frame->user_sp >= thread->signal_stack_base
|
||||
+ thread->signal_stack_size)) {
|
||||
return (uint8*)(thread->signal_stack_base + thread->signal_stack_size);
|
||||
addr_t stackTop = thread->signal_stack_base + thread->signal_stack_size;
|
||||
return (uint8*)arch_randomize_stack_pointer(stackTop);
|
||||
}
|
||||
|
||||
// We are going to use the stack that we are already on. We must not touch
|
||||
@@ -198,15 +208,6 @@ arch_thread_dump_info(void* info)
|
||||
}
|
||||
|
||||
|
||||
static addr_t
|
||||
arch_randomize_stack_pointer(addr_t value)
|
||||
{
|
||||
STATIC_ASSERT(MAX_RANDOM_VALUE >= B_PAGE_SIZE - 1);
|
||||
value -= random_value() & (B_PAGE_SIZE - 1);
|
||||
return value & ~addr_t(0xf);
|
||||
}
|
||||
|
||||
|
||||
/*! Sets up initial thread context and enters user space
|
||||
*/
|
||||
status_t
|
||||
|
||||
Reference in New Issue
Block a user