From 3c79ad7aa00e7a6bf153008d2105ca524e07772b Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Sat, 14 May 2016 09:13:39 +0200 Subject: [PATCH] detect stack overflow by adding a guard page --- hermit/kernel/tasks.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/hermit/kernel/tasks.c b/hermit/kernel/tasks.c index a53dd0545..1857a72cc 100644 --- a/hermit/kernel/tasks.c +++ b/hermit/kernel/tasks.c @@ -333,10 +333,14 @@ int clone_task(tid_t* id, entry_point_t ep, void* arg, uint8_t prio) curr_task = per_core(current_task); - stack = kmalloc(DEFAULT_STACK_SIZE); + stack = kmalloc(DEFAULT_STACK_SIZE + PAGE_SIZE); if (BUILTIN_EXPECT(!stack, 0)) return -ENOMEM; + // unmap the first page to detect a stack overflow + page_unmap((size_t)stack, 1); + stack = (void*) ((size_t) stack + PAGE_SIZE); + spinlock_irqsave_lock(&table_lock); core_id = get_next_core_id(); @@ -419,10 +423,14 @@ int create_task(tid_t* id, entry_point_t ep, void* arg, uint8_t prio, uint32_t c if (BUILTIN_EXPECT(!readyqueues[core_id].idle, 0)) return -EINVAL; - stack = kmalloc(DEFAULT_STACK_SIZE); + stack = kmalloc(DEFAULT_STACK_SIZE + PAGE_SIZE); if (BUILTIN_EXPECT(!stack, 0)) return -ENOMEM; + // unmap the first page to detect a stack overflow + page_unmap((size_t)stack, 1); + stack = (void*) ((size_t) stack + PAGE_SIZE); + counter = kmalloc(sizeof(atomic_int64_t)); if (BUILTIN_EXPECT(!counter, 0)) { kfree(stack);