|
@@ -363,10 +363,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
|
else
|
|
|
put_user_ex(0, &frame->uc.uc_flags);
|
|
|
put_user_ex(0, &frame->uc.uc_link);
|
|
|
- put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
|
|
|
- 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 |= __save_altstack(&frame->uc.uc_stack, regs->sp);
|
|
|
|
|
|
/* Set up to return from userspace. */
|
|
|
restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn);
|
|
@@ -413,7 +410,6 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
|
struct rt_sigframe __user *frame;
|
|
|
void __user *fp = NULL;
|
|
|
int err = 0;
|
|
|
- struct task_struct *me = current;
|
|
|
|
|
|
frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe), &fp);
|
|
|
|
|
@@ -432,10 +428,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
|
else
|
|
|
put_user_ex(0, &frame->uc.uc_flags);
|
|
|
put_user_ex(0, &frame->uc.uc_link);
|
|
|
- put_user_ex(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
|
|
|
- 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 |= __save_altstack(&frame->uc.uc_stack, regs->sp);
|
|
|
|
|
|
/* Set up to return from userspace. If provided, use a stub
|
|
|
already in userspace. */
|
|
@@ -502,10 +495,7 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka,
|
|
|
else
|
|
|
put_user_ex(0, &frame->uc.uc_flags);
|
|
|
put_user_ex(0, &frame->uc.uc_link);
|
|
|
- put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
|
|
|
- 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 |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp);
|
|
|
put_user_ex(0, &frame->uc.uc__pad0);
|
|
|
|
|
|
if (ka->sa.sa_flags & SA_RESTORER) {
|
|
@@ -651,7 +641,7 @@ long sys_rt_sigreturn(struct pt_regs *regs)
|
|
|
if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
|
|
|
goto badframe;
|
|
|
|
|
|
- if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT)
|
|
|
+ if (restore_altstack(&frame->uc.uc_stack))
|
|
|
goto badframe;
|
|
|
|
|
|
return ax;
|