From 59980eae9e1876d1af9689ef0a22a7f6f093c144 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Tue, 20 Jan 2009 09:31:49 +0100 Subject: [PATCH] --- yaml --- r: 129961 b: refs/heads/master c: 552b8aa4d1edcc1c764ff6f61a7686347a2d1827 h: refs/heads/master i: 129959: 0167f72fe5ec09c2902b9dfe58ac471833c145fc v: v3 --- [refs] | 2 +- trunk/arch/x86/include/asm/syscalls.h | 2 +- trunk/arch/x86/kernel/signal.c | 11 +++++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index ff7986debb62..634428daa12f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e0a96129db574d6365e3439d16d88517c437ab33 +refs/heads/master: 552b8aa4d1edcc1c764ff6f61a7686347a2d1827 diff --git a/trunk/arch/x86/include/asm/syscalls.h b/trunk/arch/x86/include/asm/syscalls.h index 9c6797c3e56c..c0b0bda754ee 100644 --- a/trunk/arch/x86/include/asm/syscalls.h +++ b/trunk/arch/x86/include/asm/syscalls.h @@ -40,7 +40,7 @@ asmlinkage int sys_sigaction(int, const struct old_sigaction __user *, struct old_sigaction __user *); asmlinkage int sys_sigaltstack(unsigned long); asmlinkage unsigned long sys_sigreturn(unsigned long); -asmlinkage int sys_rt_sigreturn(struct pt_regs); +asmlinkage int sys_rt_sigreturn(unsigned long); /* kernel/ioport.c */ asmlinkage long sys_iopl(unsigned long); diff --git a/trunk/arch/x86/kernel/signal.c b/trunk/arch/x86/kernel/signal.c index 89bb7668041d..df0587f24c54 100644 --- a/trunk/arch/x86/kernel/signal.c +++ b/trunk/arch/x86/kernel/signal.c @@ -632,9 +632,16 @@ static long do_rt_sigreturn(struct pt_regs *regs) } #ifdef CONFIG_X86_32 -asmlinkage int sys_rt_sigreturn(struct pt_regs regs) +/* + * Note: do not pass in pt_regs directly as with tail-call optimization + * GCC will incorrectly stomp on the caller's frame and corrupt user-space + * register state: + */ +asmlinkage int sys_rt_sigreturn(unsigned long __unused) { - return do_rt_sigreturn(®s); + struct pt_regs *regs = (struct pt_regs *)&__unused; + + return do_rt_sigreturn(regs); } #else /* !CONFIG_X86_32 */ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)