aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/signal.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-11-20 14:24:26 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2012-12-19 18:07:41 -0500
commitc40702c49faef05ae324f121d8b3e215244ee152 (patch)
treeb0b2a51b07e944497da5cb48fb461963a3762cad /arch/x86/kernel/signal.c
parent9026843952adac5b123c7b8dc961e5c15828d9e1 (diff)
new helpers: __save_altstack/__compat_save_altstack, switch x86 and um to those
note that they are relying on access_ok() already checked by caller. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/x86/kernel/signal.c')
-rw-r--r--arch/x86/kernel/signal.c18
1 files changed, 4 insertions, 14 deletions
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index b17ed37c61a2..a6c8a347b8c6 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -363,10 +363,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
363 else 363 else
364 put_user_ex(0, &frame->uc.uc_flags); 364 put_user_ex(0, &frame->uc.uc_flags);
365 put_user_ex(0, &frame->uc.uc_link); 365 put_user_ex(0, &frame->uc.uc_link);
366 put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); 366 err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
367 put_user_ex(sas_ss_flags(regs->sp),
368 &frame->uc.uc_stack.ss_flags);
369 put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
370 367
371 /* Set up to return from userspace. */ 368 /* Set up to return from userspace. */
372 restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); 369 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,
413 struct rt_sigframe __user *frame; 410 struct rt_sigframe __user *frame;
414 void __user *fp = NULL; 411 void __user *fp = NULL;
415 int err = 0; 412 int err = 0;
416 struct task_struct *me = current;
417 413
418 frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe), &fp); 414 frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe), &fp);
419 415
@@ -432,10 +428,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
432 else 428 else
433 put_user_ex(0, &frame->uc.uc_flags); 429 put_user_ex(0, &frame->uc.uc_flags);
434 put_user_ex(0, &frame->uc.uc_link); 430 put_user_ex(0, &frame->uc.uc_link);
435 put_user_ex(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp); 431 err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
436 put_user_ex(sas_ss_flags(regs->sp),
437 &frame->uc.uc_stack.ss_flags);
438 put_user_ex(me->sas_ss_size, &frame->uc.uc_stack.ss_size);
439 432
440 /* Set up to return from userspace. If provided, use a stub 433 /* Set up to return from userspace. If provided, use a stub
441 already in userspace. */ 434 already in userspace. */
@@ -502,10 +495,7 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka,
502 else 495 else
503 put_user_ex(0, &frame->uc.uc_flags); 496 put_user_ex(0, &frame->uc.uc_flags);
504 put_user_ex(0, &frame->uc.uc_link); 497 put_user_ex(0, &frame->uc.uc_link);
505 put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); 498 err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp);
506 put_user_ex(sas_ss_flags(regs->sp),
507 &frame->uc.uc_stack.ss_flags);
508 put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
509 put_user_ex(0, &frame->uc.uc__pad0); 499 put_user_ex(0, &frame->uc.uc__pad0);
510 500
511 if (ka->sa.sa_flags & SA_RESTORER) { 501 if (ka->sa.sa_flags & SA_RESTORER) {
@@ -651,7 +641,7 @@ long sys_rt_sigreturn(struct pt_regs *regs)
651 if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) 641 if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
652 goto badframe; 642 goto badframe;
653 643
654 if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) 644 if (restore_altstack(&frame->uc.uc_stack))
655 goto badframe; 645 goto badframe;
656 646
657 return ax; 647 return ax;