mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-30 11:26:40 +07:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull assorted signal-related fixes from Al Viro: "uml regression fix (braino in sys_execve() patch) + a bunch of fucked sigaltstack-on-rt_sigreturn uses, similar to sparc64 fix that went in through davem's tree. m32r horrors not included - that one's waiting for maintainer." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal: microblaze: rt_sigreturn is too trigger-happy about sigaltstack errors score: do_sigaltstack() expects a userland pointer... sh64: fix altstack switching on sigreturn openrisk: fix altstack switching on sigreturn um: get_safe_registers() should be done in flush_thread(), not start_thread()
This commit is contained in:
commit
31e06a42a3
@ -111,7 +111,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
|
|||||||
|
|
||||||
/* It is more difficult to avoid calling this function than to
|
/* It is more difficult to avoid calling this function than to
|
||||||
call it and ignore errors. */
|
call it and ignore errors. */
|
||||||
if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->r1))
|
if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->r1) == -EFAULT)
|
||||||
goto badframe;
|
goto badframe;
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
|
@ -84,7 +84,6 @@ asmlinkage long _sys_rt_sigreturn(struct pt_regs *regs)
|
|||||||
{
|
{
|
||||||
struct rt_sigframe *frame = (struct rt_sigframe __user *)regs->sp;
|
struct rt_sigframe *frame = (struct rt_sigframe __user *)regs->sp;
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
stack_t st;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since we stacked the signal on a dword boundary,
|
* Since we stacked the signal on a dword boundary,
|
||||||
@ -104,11 +103,10 @@ asmlinkage long _sys_rt_sigreturn(struct pt_regs *regs)
|
|||||||
if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
|
if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
|
|
||||||
if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
|
|
||||||
goto badframe;
|
|
||||||
/* It is more difficult to avoid calling this function than to
|
/* It is more difficult to avoid calling this function than to
|
||||||
call it and ignore errors. */
|
call it and ignore errors. */
|
||||||
do_sigaltstack(&st, NULL, regs->sp);
|
if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT)
|
||||||
|
goto badframe;
|
||||||
|
|
||||||
return regs->gpr[11];
|
return regs->gpr[11];
|
||||||
|
|
||||||
|
@ -148,7 +148,6 @@ score_rt_sigreturn(struct pt_regs *regs)
|
|||||||
{
|
{
|
||||||
struct rt_sigframe __user *frame;
|
struct rt_sigframe __user *frame;
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
stack_t st;
|
|
||||||
int sig;
|
int sig;
|
||||||
|
|
||||||
/* Always make any pending restarted system calls return -EINTR */
|
/* Always make any pending restarted system calls return -EINTR */
|
||||||
@ -168,12 +167,10 @@ score_rt_sigreturn(struct pt_regs *regs)
|
|||||||
else if (sig)
|
else if (sig)
|
||||||
force_sig(sig, current);
|
force_sig(sig, current);
|
||||||
|
|
||||||
if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st)))
|
|
||||||
goto badframe;
|
|
||||||
|
|
||||||
/* It is more difficult to avoid calling this function than to
|
/* It is more difficult to avoid calling this function than to
|
||||||
call it and ignore errors. */
|
call it and ignore errors. */
|
||||||
do_sigaltstack((stack_t __user *)&st, NULL, regs->regs[0]);
|
if (do_sigaltstack(&frame->rs_uc.uc_stack, NULL, regs->regs[0]) == -EFAULT)
|
||||||
|
goto badframe;
|
||||||
regs->is_syscall = 0;
|
regs->is_syscall = 0;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
|
@ -347,7 +347,6 @@ asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,
|
|||||||
{
|
{
|
||||||
struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP;
|
struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP;
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
stack_t __user st;
|
|
||||||
long long ret;
|
long long ret;
|
||||||
|
|
||||||
/* Always make any pending restarted system calls return -EINTR */
|
/* Always make any pending restarted system calls return -EINTR */
|
||||||
@ -365,11 +364,10 @@ asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,
|
|||||||
goto badframe;
|
goto badframe;
|
||||||
regs->pc -= 4;
|
regs->pc -= 4;
|
||||||
|
|
||||||
if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
|
|
||||||
goto badframe;
|
|
||||||
/* It is more difficult to avoid calling this function than to
|
/* It is more difficult to avoid calling this function than to
|
||||||
call it and ignore errors. */
|
call it and ignore errors. */
|
||||||
do_sigaltstack(&st, NULL, REF_REG_SP);
|
if (do_sigaltstack(&frame->uc.uc_stack, NULL, REF_REG_SP) == -EFAULT)
|
||||||
|
goto badframe;
|
||||||
|
|
||||||
return (int) ret;
|
return (int) ret;
|
||||||
|
|
||||||
|
@ -32,13 +32,14 @@ void flush_thread(void)
|
|||||||
"err = %d\n", ret);
|
"err = %d\n", ret);
|
||||||
force_sig(SIGKILL, current);
|
force_sig(SIGKILL, current);
|
||||||
}
|
}
|
||||||
|
get_safe_registers(current_pt_regs()->regs.gp,
|
||||||
|
current_pt_regs()->regs.fp);
|
||||||
|
|
||||||
__switch_mm(¤t->mm->context.id);
|
__switch_mm(¤t->mm->context.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp)
|
void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp)
|
||||||
{
|
{
|
||||||
get_safe_registers(regs->regs.gp, regs->regs.fp);
|
|
||||||
PT_REGS_IP(regs) = eip;
|
PT_REGS_IP(regs) = eip;
|
||||||
PT_REGS_SP(regs) = esp;
|
PT_REGS_SP(regs) = esp;
|
||||||
current->ptrace &= ~PT_DTRACE;
|
current->ptrace &= ~PT_DTRACE;
|
||||||
|
Loading…
Reference in New Issue
Block a user