X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fcris%2Farch-v10%2Fkernel%2Fsignal.c;h=19f93fe42d963f514b02e6ddba2473cbf2164951;hb=a9fdee76789476a10f923f9fb3c84993042da3ac;hp=97b7af26a6475017e2062c3c1c03376974a541aa;hpb=8d40237c730b8be87c1b80a5d96b9c603fefa829;p=linux-2.6.git diff --git a/arch/cris/arch-v10/kernel/signal.c b/arch/cris/arch-v10/kernel/signal.c index 97b7af26a..19f93fe42 100644 --- a/arch/cris/arch-v10/kernel/signal.c +++ b/arch/cris/arch-v10/kernel/signal.c @@ -264,6 +264,7 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13, { struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp(); sigset_t set; + stack_t st; /* * Since we stacked the signal on a dword boundary, @@ -287,8 +288,11 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13, if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) goto badframe; - if (do_sigaltstack(&frame->uc.uc_stack, NULL, rdusp()) == -EFAULT) + if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) goto badframe; + /* It is more difficult to avoid calling this function than to + call it and ignore errors. */ + do_sigaltstack(&st, NULL, rdusp()); return regs->r10; @@ -384,9 +388,9 @@ static void setup_frame(int sig, struct k_sigaction *ka, /* trampoline - the desired return ip is the retcode itself */ return_ip = (unsigned long)&frame->retcode; /* This is movu.w __NR_sigreturn, r9; break 13; */ - err |= __put_user(0x9c5f, (short __user*)(frame->retcode+0)); - err |= __put_user(__NR_sigreturn, (short __user*)(frame->retcode+2)); - err |= __put_user(0xe93d, (short __user*)(frame->retcode+4)); + err |= __put_user(0x9c5f, (short *)(frame->retcode+0)); + err |= __put_user(__NR_sigreturn, (short *)(frame->retcode+2)); + err |= __put_user(0xe93d, (short *)(frame->retcode+4)); } if (err) @@ -444,9 +448,9 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, /* trampoline - the desired return ip is the retcode itself */ return_ip = (unsigned long)&frame->retcode; /* This is movu.w __NR_rt_sigreturn, r9; break 13; */ - err |= __put_user(0x9c5f, (short __user*)(frame->retcode+0)); - err |= __put_user(__NR_rt_sigreturn, (short __user*)(frame->retcode+2)); - err |= __put_user(0xe93d, (short __user*)(frame->retcode+4)); + err |= __put_user(0x9c5f, (short *)(frame->retcode+0)); + err |= __put_user(__NR_rt_sigreturn, (short *)(frame->retcode+2)); + err |= __put_user(0xe93d, (short *)(frame->retcode+4)); } if (err) @@ -478,9 +482,10 @@ give_sigsegv: extern inline void handle_signal(int canrestart, unsigned long sig, - siginfo_t *info, struct k_sigaction *ka, - sigset_t *oldset, struct pt_regs * regs) + siginfo_t *info, sigset_t *oldset, struct pt_regs * regs) { + struct k_sigaction *ka = ¤t->sighand->action[sig-1]; + /* Are we from a system call? */ if (canrestart) { /* If so, check system call restarting.. */ @@ -542,7 +547,6 @@ int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs) { siginfo_t info; int signr; - struct k_sigaction ka; /* * We want the common case to go fast, which @@ -556,10 +560,10 @@ int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs) if (!oldset) oldset = ¤t->blocked; - signr = get_signal_to_deliver(&info, &ka, regs, NULL); + signr = get_signal_to_deliver(&info, regs, NULL); if (signr > 0) { /* Whee! Actually deliver the signal. */ - handle_signal(canrestart, signr, &info, &ka, oldset, regs); + handle_signal(canrestart, signr, &info, oldset, regs); return 1; }