diff options
Diffstat (limited to 'arch/x86/kernel/signal.c')
| -rw-r--r-- | arch/x86/kernel/signal.c | 11 | 
1 files changed, 9 insertions, 2 deletions
| diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index 89bb7668041d..df0587f24c54 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c @@ -632,9 +632,16 @@ badframe:  }  #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) | 
