| From e243f5653f288e4efb56febfe810c26b1fb5c922 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 5 Oct 2021 00:05:43 +0200 |
| Subject: task_stack: Fix end_of_stack() for architectures with upwards-growing |
| stack |
| |
| From: Helge Deller <deller@gmx.de> |
| |
| [ Upstream commit 9cc2fa4f4a92ccc6760d764e7341be46ee8aaaa1 ] |
| |
| The function end_of_stack() returns a pointer to the last entry of a |
| stack. For architectures like parisc where the stack grows upwards |
| return the pointer to the highest address in the stack. |
| |
| Without this change I faced a crash on parisc, because the stackleak |
| functionality wrote STACKLEAK_POISON to the lowest address and thus |
| overwrote the first 4 bytes of the task_struct which included the |
| TIF_FLAGS. |
| |
| Signed-off-by: Helge Deller <deller@gmx.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| include/linux/sched/task_stack.h | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| diff --git a/include/linux/sched/task_stack.h b/include/linux/sched/task_stack.h |
| index 2413427e439c7..d10150587d819 100644 |
| --- a/include/linux/sched/task_stack.h |
| +++ b/include/linux/sched/task_stack.h |
| @@ -25,7 +25,11 @@ static inline void *task_stack_page(const struct task_struct *task) |
| |
| static inline unsigned long *end_of_stack(const struct task_struct *task) |
| { |
| +#ifdef CONFIG_STACK_GROWSUP |
| + return (unsigned long *)((unsigned long)task->stack + THREAD_SIZE) - 1; |
| +#else |
| return task->stack; |
| +#endif |
| } |
| |
| #elif !defined(__HAVE_THREAD_FUNCTIONS) |
| -- |
| 2.33.0 |
| |