|
@@ -114,11 +114,12 @@ int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
|
|
|
regs->orig_ax = -1; /* disable syscall checks */
|
|
|
|
|
|
get_user_ex(buf, &sc->fpstate);
|
|
|
- err |= restore_xstate_sig(buf, config_enabled(CONFIG_X86_32));
|
|
|
|
|
|
get_user_ex(*pax, &sc->ax);
|
|
|
} get_user_catch(err);
|
|
|
|
|
|
+ err |= restore_xstate_sig(buf, config_enabled(CONFIG_X86_32));
|
|
|
+
|
|
|
return err;
|
|
|
}
|
|
|
|
|
@@ -355,7 +356,6 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
|
put_user_ex(sig, &frame->sig);
|
|
|
put_user_ex(&frame->info, &frame->pinfo);
|
|
|
put_user_ex(&frame->uc, &frame->puc);
|
|
|
- err |= copy_siginfo_to_user(&frame->info, info);
|
|
|
|
|
|
/* Create the ucontext. */
|
|
|
if (cpu_has_xsave)
|
|
@@ -367,9 +367,6 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
|
put_user_ex(sas_ss_flags(regs->sp),
|
|
|
&frame->uc.uc_stack.ss_flags);
|
|
|
put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
|
|
|
- err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
|
|
|
- regs, set->sig[0]);
|
|
|
- err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
|
|
|
|
|
|
/* Set up to return from userspace. */
|
|
|
restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn);
|
|
@@ -386,6 +383,11 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
|
*/
|
|
|
put_user_ex(*((u64 *)&rt_retcode), (u64 *)frame->retcode);
|
|
|
} put_user_catch(err);
|
|
|
+
|
|
|
+ err |= copy_siginfo_to_user(&frame->info, info);
|
|
|
+ err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
|
|
|
+ regs, set->sig[0]);
|
|
|
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
|
|
|
|
|
|
if (err)
|
|
|
return -EFAULT;
|
|
@@ -434,8 +436,6 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
|
put_user_ex(sas_ss_flags(regs->sp),
|
|
|
&frame->uc.uc_stack.ss_flags);
|
|
|
put_user_ex(me->sas_ss_size, &frame->uc.uc_stack.ss_size);
|
|
|
- err |= setup_sigcontext(&frame->uc.uc_mcontext, fp, regs, set->sig[0]);
|
|
|
- err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
|
|
|
|
|
|
/* Set up to return from userspace. If provided, use a stub
|
|
|
already in userspace. */
|
|
@@ -448,6 +448,9 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
|
}
|
|
|
} put_user_catch(err);
|
|
|
|
|
|
+ err |= setup_sigcontext(&frame->uc.uc_mcontext, fp, regs, set->sig[0]);
|
|
|
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
|
|
|
+
|
|
|
if (err)
|
|
|
return -EFAULT;
|
|
|
|
|
@@ -504,9 +507,6 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka,
|
|
|
&frame->uc.uc_stack.ss_flags);
|
|
|
put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
|
|
|
put_user_ex(0, &frame->uc.uc__pad0);
|
|
|
- err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
|
|
|
- regs, set->sig[0]);
|
|
|
- err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
|
|
|
|
|
|
if (ka->sa.sa_flags & SA_RESTORER) {
|
|
|
restorer = ka->sa.sa_restorer;
|
|
@@ -518,6 +518,10 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka,
|
|
|
put_user_ex(restorer, &frame->pretcode);
|
|
|
} put_user_catch(err);
|
|
|
|
|
|
+ err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
|
|
|
+ regs, set->sig[0]);
|
|
|
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
|
|
|
+
|
|
|
if (err)
|
|
|
return -EFAULT;
|
|
|
|