Messages in this thread Patch in this message | | | Subject | [PATCH] x86-64: fix stack bounds checking in get_wchan | From | Konstantin Khlebnikov <> | Date | Thu, 05 Dec 2013 17:40:17 +0400 |
| |
This patch fixes potential oops on unwinding volatile stack. get_wchan() is lockless, task may wake up at any time and override any frame under us. Stackframe is 16 bytes long plus it's supposed to be 64bit aligned.
Signed-off-by: Konstantin Khlebnikov <k.khlebnikov@samsung.com> --- arch/x86/kernel/process_64.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 9c0280f..a7f089d 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -442,12 +442,11 @@ unsigned long get_wchan(struct task_struct *p) if (!p || p == current || p->state == TASK_RUNNING) return 0; stack = (unsigned long)task_stack_page(p); - if (p->thread.sp < stack || p->thread.sp >= stack+THREAD_SIZE) + if (p->thread.sp < stack || p->thread.sp > stack + THREAD_SIZE - 8) return 0; fp = *(u64 *)(p->thread.sp); do { - if (fp < (unsigned long)stack || - fp >= (unsigned long)stack+THREAD_SIZE) + if (fp < stack || fp > stack + THREAD_SIZE - 16 || fp & 7) return 0; ip = *(u64 *)(fp+8); if (!in_sched_functions(ip))
| |