Index: kernel/fork.c |
diff --git a/kernel/fork.c b/kernel/fork.c |
index 83fb59a7b239322fe41c19c7715dbc5398a27aa9..592b3c8879ccb474fb0a6c5b7411f7b8c677e982 100644 |
--- a/kernel/fork.c |
+++ b/kernel/fork.c |
@@ -237,6 +237,12 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node) |
struct page *page = alloc_pages_node(node, THREADINFO_GFP, |
THREAD_SIZE_ORDER); |
+ if (kasan_stack_alloc(page ? page_address(page) : NULL, |
+ PAGE_SIZE << THREAD_SIZE_ORDER)) { |
+ __free_pages(page, THREAD_SIZE_ORDER); |
+ page = NULL; |
+ } |
+ |
return page ? page_address(page) : NULL; |
#endif |
} |
@@ -264,6 +270,7 @@ static inline void free_thread_stack(struct task_struct *tsk) |
} |
#endif |
+ kasan_stack_free(tsk->stack, PAGE_SIZE << THREAD_SIZE_ORDER); |
__free_pages(virt_to_page(tsk->stack), THREAD_SIZE_ORDER); |
} |
# else |