Skip to content

Commit ead8e4e

Browse files
author
Al Viro
committed
x86: __setup_rt_frame(): consolidate uaccess areas
reorder copy_siginfo_to_user() calls a bit Signed-off-by: Al Viro <[email protected]>
1 parent 5c1f178 commit ead8e4e

File tree

1 file changed

+9
-17
lines changed

1 file changed

+9
-17
lines changed

arch/x86/kernel/signal.c

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,6 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
357357
{
358358
struct rt_sigframe __user *frame;
359359
void __user *restorer;
360-
int err = 0;
361360
void __user *fp = NULL;
362361

363362
frame = get_sigframe(&ksig->ka, regs, sizeof(*frame), &fp);
@@ -393,11 +392,11 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
393392
*/
394393
unsafe_put_user(*((u64 *)&rt_retcode), (u64 *)frame->retcode, Efault);
395394
unsafe_put_sigcontext(&frame->uc.uc_mcontext, fp, regs, set, Efault);
395+
unsafe_put_user(*(__u64 *)set,
396+
(__u64 __user *)&frame->uc.uc_sigmask, Efault);
396397
user_access_end();
397398

398-
err |= copy_siginfo_to_user(&frame->info, &ksig->info);
399-
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
400-
if (err)
399+
if (copy_siginfo_to_user(&frame->info, &ksig->info))
401400
return -EFAULT;
402401

403402
/* Set up registers for signal handler */
@@ -439,23 +438,14 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
439438
struct rt_sigframe __user *frame;
440439
void __user *fp = NULL;
441440
unsigned long uc_flags;
442-
int err = 0;
443441

444442
/* x86-64 should always use SA_RESTORER. */
445443
if (!(ksig->ka.sa.sa_flags & SA_RESTORER))
446444
return -EFAULT;
447445

448446
frame = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe), &fp);
449-
450-
if (!access_ok(frame, sizeof(*frame)))
451-
return -EFAULT;
452-
453-
if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
454-
if (copy_siginfo_to_user(&frame->info, &ksig->info))
455-
return -EFAULT;
456-
}
457-
458447
uc_flags = frame_uc_flags(regs);
448+
459449
if (!user_access_begin(frame, sizeof(*frame)))
460450
return -EFAULT;
461451

@@ -468,11 +458,13 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
468458
already in userspace. */
469459
unsafe_put_user(ksig->ka.sa.sa_restorer, &frame->pretcode, Efault);
470460
unsafe_put_sigcontext(&frame->uc.uc_mcontext, fp, regs, set, Efault);
461+
unsafe_put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0], Efault);
471462
user_access_end();
472-
err |= __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]);
473463

474-
if (err)
475-
return -EFAULT;
464+
if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
465+
if (copy_siginfo_to_user(&frame->info, &ksig->info))
466+
return -EFAULT;
467+
}
476468

477469
/* Set up registers for signal handler */
478470
regs->di = sig;

0 commit comments

Comments
 (0)