diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2020-02-16 03:18:02 +0100 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2020-03-26 19:57:10 +0100 |
commit | 5c1f178094631e8b9acc67e4a9b6e03abfbc2529 (patch) | |
tree | fd9d5dd4efb88a1ad88573b184c9a3bc3d794b37 /arch/x86/kernel/signal.c | |
parent | x86: setup_sigcontext(): list user_access_{begin,end}() into callers (diff) | |
download | linux-5c1f178094631e8b9acc67e4a9b6e03abfbc2529.tar.xz linux-5c1f178094631e8b9acc67e4a9b6e03abfbc2529.zip |
x86: __setup_frame(): consolidate uaccess areas
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.c | 23 |
1 files changed, 6 insertions, 17 deletions
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index f4fb00bd2378..38ff834ba0d6 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c @@ -302,25 +302,16 @@ __setup_frame(int sig, struct ksignal *ksig, sigset_t *set, { struct sigframe __user *frame; void __user *restorer; - int err = 0; void __user *fp = NULL; frame = get_sigframe(&ksig->ka, regs, sizeof(*frame), &fp); - if (!access_ok(frame, sizeof(*frame))) - return -EFAULT; - - if (__put_user(sig, &frame->sig)) + if (!user_access_begin(frame, sizeof(*frame))) return -EFAULT; - if (!user_access_begin(&frame->sc, sizeof(struct sigcontext))) - return -EFAULT; + unsafe_put_user(sig, &frame->sig, Efault); unsafe_put_sigcontext(&frame->sc, fp, regs, set, Efault); - user_access_end(); - - if (__put_user(set->sig[1], &frame->extramask[0])) - return -EFAULT; - + unsafe_put_user(set->sig[1], &frame->extramask[0], Efault); if (current->mm->context.vdso) restorer = current->mm->context.vdso + vdso_image_32.sym___kernel_sigreturn; @@ -330,7 +321,7 @@ __setup_frame(int sig, struct ksignal *ksig, sigset_t *set, restorer = ksig->ka.sa.sa_restorer; /* Set up to return from userspace. */ - err |= __put_user(restorer, &frame->pretcode); + unsafe_put_user(restorer, &frame->pretcode, Efault); /* * This is popl %eax ; movl $__NR_sigreturn, %eax ; int $0x80 @@ -339,10 +330,8 @@ __setup_frame(int sig, struct ksignal *ksig, sigset_t *set, * reasons and because gdb uses it as a signature to notice * signal handler stack frames. */ - err |= __put_user(*((u64 *)&retcode), (u64 *)frame->retcode); - - if (err) - return -EFAULT; + unsafe_put_user(*((u64 *)&retcode), (u64 *)frame->retcode, Efault); + user_access_end(); /* Set up registers for signal handler */ regs->sp = (unsigned long)frame; |