if (verify_area(VERIFY_READ, sf, sizeof(*sf)))
goto segv_and_exit;
- if (((uint) sf) & 3)
+ if (((unsigned long) sf) & 3)
goto segv_and_exit;
err = __get_user(pc, &sf->info.si_regs.pc);
synchronize_user_stack();
- if (current->thread.new_signal)
- return do_new_sigreturn(regs);
+ if (current->thread.new_signal) {
+ do_new_sigreturn(regs);
+ return;
+ }
scptr = (struct sigcontext __user *) regs->u_regs[UREG_I0];
struct rt_signal_frame __user *sf;
unsigned int psr, pc, npc;
__siginfo_fpu_t __user *fpu_save;
+ mm_segment_t old_fs;
sigset_t set;
stack_t st;
int err;
/* It is more difficult to avoid calling this function than to
* call it and ignore errors.
*/
- do_sigaltstack(&st, NULL, (unsigned long)sf);
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+ do_sigaltstack((const stack_t __user *) &st, NULL, (unsigned long)sf);
+ set_fs(old_fs);
sigdelsetmask(&set, ~_BLOCKABLE);
spin_lock_irq(¤t->sighand->siglock);
/* Arguments passed to signal handler */
if (regs->u_regs[14]){
- struct reg_window *rw = (struct reg_window __user *)
+ struct reg_window __user *rw = (struct reg_window __user *)
regs->u_regs[14];
err |= __put_user(signr, &rw->ins[0]);
goto sigsegv;
regs->u_regs[UREG_I0] = signr;
- regs->u_regs[UREG_I1] = (uint) si;
- regs->u_regs[UREG_I2] = (uint) uc;
+ regs->u_regs[UREG_I1] = (unsigned long) si;
+ regs->u_regs[UREG_I2] = (unsigned long) uc;
}
return;
{
svr4_gregset_t __user *gr;
unsigned long pc, npc, psr;
+ mm_segment_t old_fs;
sigset_t set;
svr4_sigset_t setv;
int err;
if (current_thread_info()->w_saved)
goto sigsegv_and_return;
- if (((uint) c) & 3)
+ if (((unsigned long) c) & 3)
goto sigsegv_and_return;
if (!__access_ok((unsigned long)c, sizeof(*c)))
/* It is more difficult to avoid calling this function than to
call it and ignore errors. */
- do_sigaltstack(&st, NULL, regs->u_regs[UREG_I6]);
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+ do_sigaltstack((const stack_t __user *) &st, NULL,
+ regs->u_regs[UREG_I6]);
+ set_fs(old_fs);
set.sig[0] = setv.sigbits[0];
set.sig[1] = setv.sigbits[1];