diff options
| -rw-r--r-- | arch/x86/kernel/signal_32.c | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/arch/x86/kernel/signal_32.c b/arch/x86/kernel/signal_32.c index 48982f7ce886..b668efc18eae 100644 --- a/arch/x86/kernel/signal_32.c +++ b/arch/x86/kernel/signal_32.c | |||
| @@ -344,7 +344,6 @@ __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
| 344 | struct sigframe __user *frame; | 344 | struct sigframe __user *frame; |
| 345 | void __user *restorer; | 345 | void __user *restorer; |
| 346 | int err = 0; | 346 | int err = 0; |
| 347 | int usig; | ||
| 348 | void __user *fpstate = NULL; | 347 | void __user *fpstate = NULL; |
| 349 | 348 | ||
| 350 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 349 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); |
| @@ -352,13 +351,7 @@ __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
| 352 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 351 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
| 353 | goto give_sigsegv; | 352 | goto give_sigsegv; |
| 354 | 353 | ||
| 355 | usig = current_thread_info()->exec_domain | 354 | err = __put_user(sig, &frame->sig); |
| 356 | && current_thread_info()->exec_domain->signal_invmap | ||
| 357 | && sig < 32 | ||
| 358 | ? current_thread_info()->exec_domain->signal_invmap[sig] | ||
| 359 | : sig; | ||
| 360 | |||
| 361 | err = __put_user(usig, &frame->sig); | ||
| 362 | if (err) | 355 | if (err) |
| 363 | goto give_sigsegv; | 356 | goto give_sigsegv; |
| 364 | 357 | ||
| @@ -422,7 +415,6 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 422 | struct rt_sigframe __user *frame; | 415 | struct rt_sigframe __user *frame; |
| 423 | void __user *restorer; | 416 | void __user *restorer; |
| 424 | int err = 0; | 417 | int err = 0; |
| 425 | int usig; | ||
| 426 | void __user *fpstate = NULL; | 418 | void __user *fpstate = NULL; |
| 427 | 419 | ||
| 428 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 420 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); |
| @@ -430,13 +422,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 430 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 422 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
| 431 | goto give_sigsegv; | 423 | goto give_sigsegv; |
| 432 | 424 | ||
| 433 | usig = current_thread_info()->exec_domain | 425 | err |= __put_user(sig, &frame->sig); |
| 434 | && current_thread_info()->exec_domain->signal_invmap | ||
| 435 | && sig < 32 | ||
| 436 | ? current_thread_info()->exec_domain->signal_invmap[sig] | ||
| 437 | : sig; | ||
| 438 | |||
| 439 | err |= __put_user(usig, &frame->sig); | ||
| 440 | err |= __put_user(&frame->info, &frame->pinfo); | 426 | err |= __put_user(&frame->info, &frame->pinfo); |
| 441 | err |= __put_user(&frame->uc, &frame->puc); | 427 | err |= __put_user(&frame->uc, &frame->puc); |
| 442 | err |= copy_siginfo_to_user(&frame->info, info); | 428 | err |= copy_siginfo_to_user(&frame->info, info); |
| @@ -482,7 +468,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 482 | /* Set up registers for signal handler */ | 468 | /* Set up registers for signal handler */ |
| 483 | regs->sp = (unsigned long)frame; | 469 | regs->sp = (unsigned long)frame; |
| 484 | regs->ip = (unsigned long)ka->sa.sa_handler; | 470 | regs->ip = (unsigned long)ka->sa.sa_handler; |
| 485 | regs->ax = (unsigned long)usig; | 471 | regs->ax = (unsigned long)sig; |
| 486 | regs->dx = (unsigned long)&frame->info; | 472 | regs->dx = (unsigned long)&frame->info; |
| 487 | regs->cx = (unsigned long)&frame->uc; | 473 | regs->cx = (unsigned long)&frame->uc; |
| 488 | 474 | ||
| @@ -506,12 +492,19 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 506 | sigset_t *set, struct pt_regs *regs) | 492 | sigset_t *set, struct pt_regs *regs) |
| 507 | { | 493 | { |
| 508 | int ret; | 494 | int ret; |
| 495 | int usig; | ||
| 496 | |||
| 497 | usig = current_thread_info()->exec_domain | ||
| 498 | && current_thread_info()->exec_domain->signal_invmap | ||
| 499 | && sig < 32 | ||
| 500 | ? current_thread_info()->exec_domain->signal_invmap[sig] | ||
| 501 | : sig; | ||
| 509 | 502 | ||
| 510 | /* Set up the stack frame */ | 503 | /* Set up the stack frame */ |
| 511 | if (ka->sa.sa_flags & SA_SIGINFO) | 504 | if (ka->sa.sa_flags & SA_SIGINFO) |
| 512 | ret = __setup_rt_frame(sig, ka, info, set, regs); | 505 | ret = __setup_rt_frame(usig, ka, info, set, regs); |
| 513 | else | 506 | else |
| 514 | ret = __setup_frame(sig, ka, set, regs); | 507 | ret = __setup_frame(usig, ka, set, regs); |
| 515 | 508 | ||
| 516 | return ret; | 509 | return ret; |
| 517 | } | 510 | } |
