diff options
Diffstat (limited to 'arch/ia64/kernel/signal.c')
| -rw-r--r-- | arch/ia64/kernel/signal.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c index 774f34b675cf..58ce07efc56e 100644 --- a/arch/ia64/kernel/signal.c +++ b/arch/ia64/kernel/signal.c | |||
| @@ -387,15 +387,14 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, | |||
| 387 | struct sigscratch *scr) | 387 | struct sigscratch *scr) |
| 388 | { | 388 | { |
| 389 | extern char __kernel_sigtramp[]; | 389 | extern char __kernel_sigtramp[]; |
| 390 | unsigned long tramp_addr, new_rbs = 0; | 390 | unsigned long tramp_addr, new_rbs = 0, new_sp; |
| 391 | struct sigframe __user *frame; | 391 | struct sigframe __user *frame; |
| 392 | long err; | 392 | long err; |
| 393 | 393 | ||
| 394 | frame = (void __user *) scr->pt.r12; | 394 | new_sp = scr->pt.r12; |
| 395 | tramp_addr = (unsigned long) __kernel_sigtramp; | 395 | tramp_addr = (unsigned long) __kernel_sigtramp; |
| 396 | if ((ka->sa.sa_flags & SA_ONSTACK) && sas_ss_flags((unsigned long) frame) == 0) { | 396 | if ((ka->sa.sa_flags & SA_ONSTACK) && sas_ss_flags(new_sp) == 0) { |
| 397 | frame = (void __user *) ((current->sas_ss_sp + current->sas_ss_size) | 397 | new_sp = current->sas_ss_sp + current->sas_ss_size; |
| 398 | & ~(STACK_ALIGN - 1)); | ||
| 399 | /* | 398 | /* |
| 400 | * We need to check for the register stack being on the signal stack | 399 | * We need to check for the register stack being on the signal stack |
| 401 | * separately, because it's switched separately (memory stack is switched | 400 | * separately, because it's switched separately (memory stack is switched |
| @@ -404,7 +403,7 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, | |||
| 404 | if (!rbs_on_sig_stack(scr->pt.ar_bspstore)) | 403 | if (!rbs_on_sig_stack(scr->pt.ar_bspstore)) |
| 405 | new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1); | 404 | new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1); |
| 406 | } | 405 | } |
| 407 | frame = (void __user *) frame - ((sizeof(*frame) + STACK_ALIGN - 1) & ~(STACK_ALIGN - 1)); | 406 | frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN); |
| 408 | 407 | ||
| 409 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 408 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
| 410 | return force_sigsegv_info(sig, frame); | 409 | return force_sigsegv_info(sig, frame); |
