diff options
Diffstat (limited to 'arch/x86/um/signal.c')
-rw-r--r-- | arch/x86/um/signal.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/arch/x86/um/signal.c b/arch/x86/um/signal.c index 06934a8a4872..14fcd01ed992 100644 --- a/arch/x86/um/signal.c +++ b/arch/x86/um/signal.c | |||
@@ -211,7 +211,7 @@ static int copy_sc_from_user(struct pt_regs *regs, | |||
211 | if (err) | 211 | if (err) |
212 | return 1; | 212 | return 1; |
213 | 213 | ||
214 | err = convert_fxsr_from_user(&fpx, sc.fpstate); | 214 | err = convert_fxsr_from_user(&fpx, (void *)sc.fpstate); |
215 | if (err) | 215 | if (err) |
216 | return 1; | 216 | return 1; |
217 | 217 | ||
@@ -227,7 +227,7 @@ static int copy_sc_from_user(struct pt_regs *regs, | |||
227 | { | 227 | { |
228 | struct user_i387_struct fp; | 228 | struct user_i387_struct fp; |
229 | 229 | ||
230 | err = copy_from_user(&fp, sc.fpstate, | 230 | err = copy_from_user(&fp, (void *)sc.fpstate, |
231 | sizeof(struct user_i387_struct)); | 231 | sizeof(struct user_i387_struct)); |
232 | if (err) | 232 | if (err) |
233 | return 1; | 233 | return 1; |
@@ -291,7 +291,7 @@ static int copy_sc_to_user(struct sigcontext __user *to, | |||
291 | #endif | 291 | #endif |
292 | #undef PUTREG | 292 | #undef PUTREG |
293 | sc.oldmask = mask; | 293 | sc.oldmask = mask; |
294 | sc.fpstate = to_fp; | 294 | sc.fpstate = (unsigned long)to_fp; |
295 | 295 | ||
296 | err = copy_to_user(to, &sc, sizeof(struct sigcontext)); | 296 | err = copy_to_user(to, &sc, sizeof(struct sigcontext)); |
297 | if (err) | 297 | if (err) |
@@ -468,12 +468,10 @@ long sys_sigreturn(void) | |||
468 | struct sigframe __user *frame = (struct sigframe __user *)(sp - 8); | 468 | struct sigframe __user *frame = (struct sigframe __user *)(sp - 8); |
469 | sigset_t set; | 469 | sigset_t set; |
470 | struct sigcontext __user *sc = &frame->sc; | 470 | struct sigcontext __user *sc = &frame->sc; |
471 | unsigned long __user *oldmask = &sc->oldmask; | ||
472 | unsigned long __user *extramask = frame->extramask; | ||
473 | int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long); | 471 | int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long); |
474 | 472 | ||
475 | if (copy_from_user(&set.sig[0], oldmask, sizeof(set.sig[0])) || | 473 | if (copy_from_user(&set.sig[0], &sc->oldmask, sizeof(set.sig[0])) || |
476 | copy_from_user(&set.sig[1], extramask, sig_size)) | 474 | copy_from_user(&set.sig[1], frame->extramask, sig_size)) |
477 | goto segfault; | 475 | goto segfault; |
478 | 476 | ||
479 | set_current_blocked(&set); | 477 | set_current_blocked(&set); |
@@ -505,6 +503,7 @@ int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig, | |||
505 | { | 503 | { |
506 | struct rt_sigframe __user *frame; | 504 | struct rt_sigframe __user *frame; |
507 | int err = 0, sig = ksig->sig; | 505 | int err = 0, sig = ksig->sig; |
506 | unsigned long fp_to; | ||
508 | 507 | ||
509 | frame = (struct rt_sigframe __user *) | 508 | frame = (struct rt_sigframe __user *) |
510 | round_down(stack_top - sizeof(struct rt_sigframe), 16); | 509 | round_down(stack_top - sizeof(struct rt_sigframe), 16); |
@@ -526,7 +525,10 @@ int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig, | |||
526 | err |= __save_altstack(&frame->uc.uc_stack, PT_REGS_SP(regs)); | 525 | err |= __save_altstack(&frame->uc.uc_stack, PT_REGS_SP(regs)); |
527 | err |= copy_sc_to_user(&frame->uc.uc_mcontext, &frame->fpstate, regs, | 526 | err |= copy_sc_to_user(&frame->uc.uc_mcontext, &frame->fpstate, regs, |
528 | set->sig[0]); | 527 | set->sig[0]); |
529 | err |= __put_user(&frame->fpstate, &frame->uc.uc_mcontext.fpstate); | 528 | |
529 | fp_to = (unsigned long)&frame->fpstate; | ||
530 | |||
531 | err |= __put_user(fp_to, &frame->uc.uc_mcontext.fpstate); | ||
530 | if (sizeof(*set) == 16) { | 532 | if (sizeof(*set) == 16) { |
531 | err |= __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]); | 533 | err |= __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]); |
532 | err |= __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]); | 534 | err |= __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]); |