diff --git a/headers/private/system/thread_defs.h b/headers/private/system/thread_defs.h index 2d559378f4..3d7a3c1654 100644 --- a/headers/private/system/thread_defs.h +++ b/headers/private/system/thread_defs.h @@ -15,7 +15,7 @@ #define USER_STACK_GUARD_SIZE (4 * B_PAGE_SIZE) // 16 kB #define USER_MAIN_THREAD_STACK_SIZE (16 * 1024 * 1024) // 16 MB #define USER_STACK_SIZE (256 * 1024) // 256 kB -#define MIN_USER_STACK_SIZE (4 * 1024) // 4 KB +#define MIN_USER_STACK_SIZE (8 * 1024) // 8 kB #define MAX_USER_STACK_SIZE (16 * 1024 * 1024) // 16 MB diff --git a/src/system/kernel/arch/x86/32/thread.cpp b/src/system/kernel/arch/x86/32/thread.cpp index 5878aacced..9e13a7ece3 100644 --- a/src/system/kernel/arch/x86/32/thread.cpp +++ b/src/system/kernel/arch/x86/32/thread.cpp @@ -200,6 +200,14 @@ arch_thread_dump_info(void *info) } +static addr_t +arch_randomize_stack_pointer(addr_t value) +{ + value -= rand() & (B_PAGE_SIZE - 1); + return value & ~0xful; +} + + /*! Sets up initial thread context and enters user space */ status_t @@ -214,6 +222,8 @@ arch_thread_enter_userspace(Thread* thread, addr_t entry, void* args1, TRACE(("arch_thread_enter_userspace: entry 0x%lx, args %p %p, " "ustack_top 0x%lx\n", entry, args1, args2, stackTop)); + stackTop = arch_randomize_stack_pointer(stackTop); + // copy the little stub that calls exit_thread() when the thread entry // function returns, as well as the arguments of the entry function stackTop -= codeSize; diff --git a/src/system/kernel/arch/x86/64/thread.cpp b/src/system/kernel/arch/x86/64/thread.cpp index 03797773ea..8c5c2fa83c 100644 --- a/src/system/kernel/arch/x86/64/thread.cpp +++ b/src/system/kernel/arch/x86/64/thread.cpp @@ -197,6 +197,14 @@ arch_thread_dump_info(void* info) } +static addr_t +arch_randomize_stack_pointer(addr_t value) +{ + value -= rand() & (B_PAGE_SIZE - 1); + return value & ~0xful; +} + + /*! Sets up initial thread context and enters user space */ status_t @@ -208,6 +216,8 @@ arch_thread_enter_userspace(Thread* thread, addr_t entry, void* args1, TRACE("arch_thread_enter_userspace: entry %#lx, args %p %p, " "stackTop %#lx\n", entry, args1, args2, stackTop); + stackTop = arch_randomize_stack_pointer(stackTop); + // Copy the little stub that calls exit_thread() when the thread entry // function returns. // TODO: This will become a problem later if we want to support execute