From 469a84e6b964ffd4e690423985ca33f02c0848fc Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Sat, 14 Jan 2006 13:20:57 -0800 Subject: [PATCH] --- yaml --- r: 18501 b: refs/heads/master c: eb33c190c2b633f0dfc98481ecf12f62a02c705e h: refs/heads/master i: 18499: a7c5af172baa4b018fcafe21324c51fe86ab3e20 v: v3 --- [refs] | 2 +- trunk/arch/s390/kernel/process.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 428d091fcb74..675c70e8d1b2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7ffbc9da137ef475afd5e01f72e1ce1ce49668b1 +refs/heads/master: eb33c190c2b633f0dfc98481ecf12f62a02c705e diff --git a/trunk/arch/s390/kernel/process.c b/trunk/arch/s390/kernel/process.c index 2ff90a1a1056..008c74526fd3 100644 --- a/trunk/arch/s390/kernel/process.c +++ b/trunk/arch/s390/kernel/process.c @@ -58,10 +58,18 @@ asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); */ unsigned long thread_saved_pc(struct task_struct *tsk) { - struct stack_frame *sf; + struct stack_frame *sf, *low, *high; - sf = (struct stack_frame *) tsk->thread.ksp; - sf = (struct stack_frame *) sf->back_chain; + if (!tsk || !task_stack_page(tsk)) + return 0; + low = task_stack_page(tsk); + high = (struct stack_frame *) task_pt_regs(tsk); + sf = (struct stack_frame *) (tsk->thread.ksp & PSW_ADDR_INSN); + if (sf <= low || sf > high) + return 0; + sf = (struct stack_frame *) (sf->back_chain & PSW_ADDR_INSN); + if (sf <= low || sf > high) + return 0; return sf->gprs[8]; }