diff options
| author | Alexander Viro <viro@parcelfarce.linux.theplanet.co.uk> | 2004-07-12 21:02:33 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-07-12 21:02:33 -0700 |
| commit | 407323e68052289a4bdf7788c3062d114d8a2ebd (patch) | |
| tree | 2771bc20e7ed0de73e2afd73560cf39b0c536d59 | |
| parent | de9c4ad800ffed7236cd4118b1cf116203854ef4 (diff) | |
[PATCH] sparse: signal annotation
ss_sp in struct sigaltstack made __user
->si_addr and ->sival_ptr made __user
your ->sa_restorer and ->sa_handler changes propagated
users of these guys annotated on i386/amd64/alpha/sparc/sparc64
30 files changed, 115 insertions, 101 deletions
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index ce82bbc1ae5f..4761ed9a44c2 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -588,7 +588,7 @@ osf_sigstack(struct sigstack __user *uss, struct sigstack __user *uoss) int error; if (uss) { - void *ss_sp; + void __user *ss_sp; error = -EFAULT; if (get_user(ss_sp, &uss->ss_sp)) diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index d908d77606f3..0797b46b7961 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c @@ -304,7 +304,7 @@ do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs, info.si_signo = SIGTRAP; info.si_errno = 0; info.si_code = TRAP_BRKPT; - info.si_addr = (void *) regs->pc; + info.si_addr = (void __user *) regs->pc; info.si_trapno = 0; send_sig_info(SIGTRAP, &info, current); } @@ -342,7 +342,7 @@ do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs, info.si_signo = SIGTRAP; info.si_errno = 0; info.si_code = TRAP_BRKPT; - info.si_addr = (void *) regs->pc; + info.si_addr = (void __user *) regs->pc; info.si_trapno = 0; send_sig_info(SIGTRAP, &info, current); } diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index 6f37c1d04ec5..2248735b8f5e 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c @@ -228,7 +228,7 @@ do_entArith(unsigned long summary, unsigned long write_mask, info.si_signo = SIGFPE; info.si_errno = 0; info.si_code = si_code; - info.si_addr = (void *) regs->pc; + info.si_addr = (void __user *) regs->pc; send_sig_info(SIGFPE, &info, current); } @@ -256,7 +256,7 @@ do_entIF(unsigned long type, struct pt_regs *regs) info.si_errno = 0; info.si_code = TRAP_BRKPT; info.si_trapno = 0; - info.si_addr = (void *) regs->pc; + info.si_addr = (void __user *) regs->pc; if (ptrace_cancel_bpt(current)) { regs->pc -= 4; /* make pc point to former bpt */ @@ -269,13 +269,13 @@ do_entIF(unsigned long type, struct pt_regs *regs) info.si_signo = SIGTRAP; info.si_errno = 0; info.si_code = __SI_FAULT; - info.si_addr = (void *) regs->pc; + info.si_addr = (void __user *) regs->pc; info.si_trapno = 0; send_sig_info(SIGTRAP, &info, current); return; case 2: /* gentrap */ - info.si_addr = (void *) regs->pc; + info.si_addr = (void __user *) regs->pc; info.si_trapno = regs->r16; switch ((long) regs->r16) { case GEN_INTOVF: @@ -337,7 +337,7 @@ do_entIF(unsigned long type, struct pt_regs *regs) info.si_signo = signo; info.si_errno = 0; info.si_code = code; - info.si_addr = (void *) regs->pc; + info.si_addr = (void __user *) regs->pc; send_sig_info(signo, &info, current); return; @@ -365,7 +365,7 @@ do_entIF(unsigned long type, struct pt_regs *regs) info.si_signo = SIGFPE; info.si_errno = 0; info.si_code = si_code; - info.si_addr = (void *) regs->pc; + info.si_addr = (void __user *) regs->pc; send_sig_info(SIGFPE, &info, current); return; } @@ -394,7 +394,7 @@ do_entIF(unsigned long type, struct pt_regs *regs) info.si_signo = SIGILL; info.si_errno = 0; info.si_code = ILL_ILLOPC; - info.si_addr = (void *) regs->pc; + info.si_addr = (void __user *) regs->pc; send_sig_info(SIGILL, &info, current); } @@ -415,7 +415,7 @@ do_entDbg(struct pt_regs *regs) info.si_signo = SIGILL; info.si_errno = 0; info.si_code = ILL_ILLOPC; - info.si_addr = (void *) regs->pc; + info.si_addr = (void __user *) regs->pc; force_sig_info(SIGILL, &info, current); } @@ -765,7 +765,7 @@ static int unauser_reg_offsets[32] = { #undef R asmlinkage void -do_entUnaUser(void * va, unsigned long opcode, +do_entUnaUser(void __user * va, unsigned long opcode, unsigned long reg, struct pt_regs *regs) { static int cnt = 0; diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c index 242317d15093..a0b969ddffe1 100644 --- a/arch/alpha/mm/fault.c +++ b/arch/alpha/mm/fault.c @@ -211,7 +211,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr, info.si_signo = SIGBUS; info.si_errno = 0; info.si_code = BUS_ADRERR; - info.si_addr = (void *) address; + info.si_addr = (void __user *) address; force_sig_info(SIGBUS, &info, current); if (!user_mode(regs)) goto no_context; @@ -221,7 +221,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr, info.si_signo = SIGSEGV; info.si_errno = 0; info.si_code = si_code; - info.si_addr = (void *) address; + info.si_addr = (void __user *) address; force_sig_info(SIGSEGV, &info, current); return; diff --git a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c index efd5dc817128..97653d20f4d1 100644 --- a/arch/i386/kernel/i8259.c +++ b/arch/i386/kernel/i8259.c @@ -320,11 +320,11 @@ void init_8259A(int auto_eoi) static irqreturn_t math_error_irq(int cpl, void *dev_id, struct pt_regs *regs) { - extern void math_error(void *); + extern void math_error(void __user *); outb(0,0xF0); if (ignore_fpu_irq || !boot_cpu_data.hard_math) return IRQ_NONE; - math_error((void *)regs->eip); + math_error((void __user *)regs->eip); return IRQ_HANDLED; } diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c index 37d7f8b82583..57e88b62591d 100644 --- a/arch/i386/kernel/signal.c +++ b/arch/i386/kernel/signal.c @@ -336,12 +336,13 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size) /* These symbols are defined with the addresses in the vsyscall page. See vsyscall-sigreturn.S. */ -extern void __kernel_sigreturn, __kernel_rt_sigreturn; +extern void __user __kernel_sigreturn; +extern void __user __kernel_rt_sigreturn; static void setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs * regs) { - void *restorer; + void __user *restorer; struct sigframe __user *frame; int err = 0; @@ -418,7 +419,7 @@ give_sigsegv: static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs * regs) { - void *restorer; + void __user *restorer; struct rt_sigframe __user *frame; int err = 0; diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index b5a1303e337b..a3daea0137a1 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c @@ -397,7 +397,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ info.si_signo = signr; \ info.si_errno = 0; \ info.si_code = sicode; \ - info.si_addr = (void *)siaddr; \ + info.si_addr = (void __user *)siaddr; \ do_trap(trapnr, signr, str, 0, regs, error_code, &info); \ } @@ -414,7 +414,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ info.si_signo = signr; \ info.si_errno = 0; \ info.si_code = sicode; \ - info.si_addr = (void *)siaddr; \ + info.si_addr = (void __user *)siaddr; \ do_trap(trapnr, signr, str, 1, regs, error_code, &info); \ } @@ -630,8 +630,8 @@ asmlinkage void do_debug(struct pt_regs * regs, long error_code) /* If this is a kernel mode trap, save the user PC on entry to * the kernel, that's what the debugger can make sense of. */ - info.si_addr = ((regs->xcs & 3) == 0) ? (void *)tsk->thread.eip : - (void *)regs->eip; + info.si_addr = ((regs->xcs & 3) == 0) ? (void __user *)tsk->thread.eip + : (void __user *)regs->eip; force_sig_info(SIGTRAP, &info, tsk); /* Disable additional traps. They'll be re-enabled when @@ -659,7 +659,7 @@ clear_TF: * the correct behaviour even in the presence of the asynchronous * IRQ13 behaviour */ -void math_error(void *eip) +void math_error(void __user *eip) { struct task_struct * task; siginfo_t info; @@ -718,10 +718,10 @@ void math_error(void *eip) asmlinkage void do_coprocessor_error(struct pt_regs * regs, long error_code) { ignore_fpu_irq = 1; - math_error((void *)regs->eip); + math_error((void __user *)regs->eip); } -void simd_math_error(void *eip) +void simd_math_error(void __user *eip) { struct task_struct * task; siginfo_t info; @@ -775,7 +775,7 @@ asmlinkage void do_simd_coprocessor_error(struct pt_regs * regs, if (cpu_has_xmm) { /* Handle SIMD FPU exceptions on PIII+ processors. */ ignore_fpu_irq = 1; - simd_math_error((void *)regs->eip); + simd_math_error((void __user *)regs->eip); } else { /* * Handle strange cache flush from user space exception diff --git a/arch/i386/mm/fault.c b/arch/i386/mm/fault.c index f502dde14e52..debed47543a2 100644 --- a/arch/i386/mm/fault.c +++ b/arch/i386/mm/fault.c @@ -389,7 +389,7 @@ bad_area_nosemaphore: info.si_signo = SIGSEGV; info.si_errno = 0; /* info.si_code has been set above */ - info.si_addr = (void *)address; + info.si_addr = (void __user *)address; force_sig_info(SIGSEGV, &info, tsk); return; } @@ -499,7 +499,7 @@ do_sigbus: info.si_signo = SIGBUS; info.si_errno = 0; info.si_code = BUS_ADRERR; - info.si_addr = (void *)address; + info.si_addr = (void __user *)address; force_sig_info(SIGBUS, &info, tsk); return; diff --git a/arch/sparc/kernel/signal.c b/arch/sparc/kernel/signal.c index 68847c143706..b42ed5f8b8d5 100644 --- a/arch/sparc/kernel/signal.c +++ b/arch/sparc/kernel/signal.c @@ -439,7 +439,7 @@ setup_frame(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *old unsigned long pc = regs->pc; unsigned long npc = regs->npc; struct thread_info *tp = current_thread_info(); - void *sig_address; + void __user *sig_address; int sig_code; synchronize_user_stack(); diff --git a/arch/sparc/kernel/sys_sparc.c b/arch/sparc/kernel/sys_sparc.c index 1222d0192d27..a17dbc3a1227 100644 --- a/arch/sparc/kernel/sys_sparc.c +++ b/arch/sparc/kernel/sys_sparc.c @@ -375,7 +375,7 @@ sparc_breakpoint (struct pt_regs *regs) info.si_signo = SIGTRAP; info.si_errno = 0; info.si_code = TRAP_BRKPT; - info.si_addr = (void *)regs->pc; + info.si_addr = (void __user *)regs->pc; info.si_trapno = 0; force_sig_info(SIGTRAP, &info, current); diff --git a/arch/sparc/kernel/sys_sunos.c b/arch/sparc/kernel/sys_sunos.c index 6b2bccee769b..1ff73f0fd05a 100644 --- a/arch/sparc/kernel/sys_sunos.c +++ b/arch/sparc/kernel/sys_sunos.c @@ -505,7 +505,7 @@ asmlinkage int sunos_nosys(void) info.si_signo = SIGSYS; info.si_errno = 0; info.si_code = __SI_FAULT|0x100; - info.si_addr = (void *)regs->pc; + info.si_addr = (void __user *)regs->pc; info.si_trapno = regs->u_regs[UREG_G1]; send_sig_info(SIGSYS, &info, current); if (cnt++ < 4) { diff --git a/arch/sparc/kernel/traps.c b/arch/sparc/kernel/traps.c index 136a00c7be00..ceb4a8f29abd 100644 --- a/arch/sparc/kernel/traps.c +++ b/arch/sparc/kernel/traps.c @@ -147,7 +147,7 @@ void do_hw_interrupt(struct pt_regs *regs, unsigned long type) info.si_signo = SIGILL; info.si_errno = 0; info.si_code = ILL_ILLTRP; - info.si_addr = (void *)regs->pc; + info.si_addr = (void __user *)regs->pc; info.si_trapno = type - 0x80; force_sig_info(SIGILL, &info, current); } @@ -170,7 +170,7 @@ void do_illegal_instruction(struct pt_regs *regs, unsigned long pc, unsigned lon info.si_signo = SIGILL; info.si_errno = 0; info.si_code = ILL_ILLOPC; - info.si_addr = (void *)pc; + info.si_addr = (void __user *)pc; info.si_trapno = 0; send_sig_info(SIGILL, &info, current); } @@ -185,7 +185,7 @@ void do_priv_instruction(struct pt_regs *regs, unsigned long pc, unsigned long n info.si_signo = SIGILL; info.si_errno = 0; info.si_code = ILL_PRVOPC; - info.si_addr = (void *)pc; + info.si_addr = (void __user *)pc; info.si_trapno = 0; send_sig_info(SIGILL, &info, current); } @@ -354,7 +354,7 @@ void do_fpe_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc, fsr = fpt->thread.fsr; info.si_signo = SIGFPE; info.si_errno = 0; - info.si_addr = (void *)pc; + info.si_addr = (void __user *)pc; info.si_trapno = 0; info.si_code = __SI_FAULT; if ((fsr & 0x1c000) == (1 << 14)) { @@ -388,7 +388,7 @@ void handle_tag_overflow(struct pt_regs *regs, unsigned long pc, unsigned long n info.si_signo = SIGEMT; info.si_errno = 0; info.si_code = EMT_TAGOVF; - info.si_addr = (void *)pc; + info.si_addr = (void __user *)pc; info.si_trapno = 0; send_sig_info(SIGEMT, &info, current); } @@ -417,7 +417,7 @@ void handle_reg_access(struct pt_regs *regs, unsigned long pc, unsigned long npc info.si_signo = SIGBUS; info.si_errno = 0; info.si_code = BUS_OBJERR; - info.si_addr = (void *)pc; + info.si_addr = (void __user *)pc; info.si_trapno = 0; force_sig_info(SIGBUS, &info, current); } @@ -430,7 +430,7 @@ void handle_cp_disabled(struct pt_regs *regs, unsigned long pc, unsigned long np info.si_signo = SIGILL; info.si_errno = 0; info.si_code = ILL_COPROC; - info.si_addr = (void *)pc; + info.si_addr = (void __user *)pc; info.si_trapno = 0; send_sig_info(SIGILL, &info, current); } @@ -447,7 +447,7 @@ void handle_cp_exception(struct pt_regs *regs, unsigned long pc, unsigned long n info.si_signo = SIGILL; info.si_errno = 0; info.si_code = ILL_COPROC; - info.si_addr = (void *)pc; + info.si_addr = (void __user *)pc; info.si_trapno = 0; send_sig_info(SIGILL, &info, current); } @@ -460,7 +460,7 @@ void handle_hw_divzero(struct pt_regs *regs, unsigned long pc, unsigned long npc info.si_signo = SIGFPE; info.si_errno = 0; info.si_code = FPE_INTDIV; - info.si_addr = (void *)pc; + info.si_addr = (void __user *)pc; info.si_trapno = 0; send_sig_info(SIGFPE, &info, current); } diff --git a/arch/sparc/kernel/unaligned.c b/arch/sparc/kernel/unaligned.c index a9a9e0c73ae4..a40bbcfeb898 100644 --- a/arch/sparc/kernel/unaligned.c +++ b/arch/sparc/kernel/unaligned.c @@ -473,7 +473,7 @@ void user_mna_trap_fault(struct pt_regs *regs, unsigned int insn) info.si_signo = SIGBUS; info.si_errno = 0; info.si_code = BUS_ADRALN; - info.si_addr = (void *)safe_compute_effective_address(regs, insn); + info.si_addr = (void __user *)safe_compute_effective_address(regs, insn); info.si_trapno = 0; send_sig_info(SIGBUS, &info, current); } diff --git a/arch/sparc/mm/fault.c b/arch/sparc/mm/fault.c index cc857f681d97..dde63e16c7d2 100644 --- a/arch/sparc/mm/fault.c +++ b/arch/sparc/mm/fault.c @@ -326,7 +326,7 @@ bad_area_nosemaphore: info.si_errno = 0; /* info.si_code set above to make clear whether this was a SEGV_MAPERR or SEGV_ACCERR fault. */ - info.si_addr = (void *) compute_si_addr(regs, text_fault); + info.si_addr = (void __user *)compute_si_addr(regs, text_fault); info.si_trapno = 0; force_sig_info (SIGSEGV, &info, tsk); return; @@ -380,7 +380,7 @@ do_sigbus: info.si_signo = SIGBUS; info.si_errno = 0; info.si_code = BUS_ADRERR; - info.si_addr = (void *) compute_si_addr(regs, text_fault); + info.si_addr = (void __user *) compute_si_addr(regs, text_fault); info.si_trapno = 0; force_sig_info (SIGBUS, &info, tsk); if (!from_user) @@ -549,7 +549,7 @@ bad_area: info.si_errno = 0; /* info.si_code set above to make clear whether this was a SEGV_MAPERR or SEGV_ACCERR fault. */ - info.si_addr = (void *) address; + info.si_addr = (void __user *) address; info.si_trapno = 0; force_sig_info (SIGSEGV, &info, tsk); return; @@ -559,7 +559,7 @@ do_sigbus: info.si_signo = SIGBUS; info.si_errno = 0; info.si_code = BUS_ADRERR; - info.si_addr = (void *) address; + info.si_addr = (void __user *) address; info.si_trapno = 0; force_sig_info (SIGBUS, &info, tsk); } diff --git a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c index 2fb26c9b970c..a9a5b31a3a3a 100644 --- a/arch/sparc64/kernel/signal32.c +++ b/arch/sparc64/kernel/signal32.c @@ -461,7 +461,7 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) err |= restore_fpu_state32(regs, &sf->fpu_state); err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t)); err |= __get_user(u_ss_sp, &sf->stack.ss_sp); - st.ss_sp = (void *) (long) u_ss_sp; + st.ss_sp = compat_ptr(u_ss_sp); err |= __get_user(st.ss_flags, &sf->stack.ss_flags); err |= __get_user(st.ss_size, &sf->stack.ss_size); if (err) @@ -520,7 +520,7 @@ setup_frame32(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *o struct sigcontext32 __user *sc; unsigned int seta[_COMPAT_NSIG_WORDS]; int err = 0; - void *sig_address; + void __user *sig_address; int sig_code; unsigned long pc = regs->tpc; unsigned long npc = regs->tnpc; @@ -1031,7 +1031,7 @@ asmlinkage int svr4_setcontext(svr4_ucontext_t __user *c, struct pt_regs *regs) set.sig[1] = setv.sigbits[2] | (((long)setv.sigbits[3]) << 32); err |= __get_user(u_ss_sp, &c->stack.sp); - st.ss_sp = (void *) (long) u_ss_sp; + st.ss_sp = compat_ptr(u_ss_sp); err |= __get_user(st.ss_flags, &c->stack.flags); err |= __get_user(st.ss_size, &c->stack.size); if (err) @@ -1360,7 +1360,7 @@ asmlinkage long do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp) __get_user(uss.ss_flags, &((stack_t32 __user *)(long)ussa)->ss_flags) || __get_user(uss.ss_size, &((stack_t32 __user *)(long)ussa)->ss_size))) return -EFAULT; - uss.ss_sp = (void *) (long) u_ss_sp; + uss.ss_sp = compat_ptr(u_ss_sp); old_fs = get_fs(); set_fs(KERNEL_DS); ret = do_sigaltstack(ussa ? (stack_t __user *) &uss : NULL, diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index 5325e41e834d..76e62d43d62b 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c @@ -448,7 +448,7 @@ asmlinkage void sparc_breakpoint(struct pt_regs *regs) info.si_signo = SIGTRAP; info.si_errno = 0; info.si_code = TRAP_BRKPT; - info.si_addr = (void *)regs->tpc; + info.si_addr = (void __user *)regs->tpc; info.si_trapno = 0; force_sig_info(SIGTRAP, &info, current); #ifdef DEBUG_SPARC_BREAKPOINT diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index e55f9e494d5a..20428c06939f 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c @@ -1293,9 +1293,9 @@ asmlinkage long compat_sys_sigaction(int sig, struct old_sigaction32 __user *act u32 u_handler, u_restorer; ret = get_user(u_handler, &act->sa_handler); - new_ka.sa.sa_handler = (void *) (long) u_handler; + new_ka.sa.sa_handler = compat_ptr(u_handler); ret |= __get_user(u_restorer, &act->sa_restorer); - new_ka.sa.sa_restorer = (void *) (long) u_restorer; + new_ka.sa.sa_restorer = compat_ptr(u_restorer); ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); ret |= __get_user(mask, &act->sa_mask); if (ret) @@ -1340,7 +1340,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig, new_ka.ka_restorer = restorer; ret = get_user(u_handler, &act->sa_handler); - new_ka.sa.sa_handler = (void *) (long) u_handler; + new_ka.sa.sa_handler = compat_ptr(u_handler); ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t)); switch (_NSIG_WORDS) { case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6] | (((long)set32.sig[7]) << 32); @@ -1350,7 +1350,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig, } ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); ret |= __get_user(u_restorer, &act->sa_restorer); - new_ka.sa.sa_restorer = (void *) (long) u_restorer; + new_ka.sa.sa_restorer = compat_ptr(u_restorer); if (ret) return -EFAULT; } diff --git a/arch/sparc64/kernel/sys_sunos32.c b/arch/sparc64/kernel/sys_sunos32.c index 0ed11eaec00f..ace96ee27879 100644 --- a/arch/sparc64/kernel/sys_sunos32.c +++ b/arch/sparc64/kernel/sys_sunos32.c @@ -465,7 +465,7 @@ asmlinkage int sunos_nosys(void) info.si_signo = SIGSYS; info.si_errno = 0; info.si_code = __SI_FAULT|0x100; - info.si_addr = (void *)regs->tpc; + info.si_addr = (void __user *)regs->tpc; info.si_trapno = regs->u_regs[UREG_G1]; send_sig_info(SIGSYS, &info, current); if (cnt++ < 4) { @@ -1280,7 +1280,7 @@ asmlinkage int sunos_sigaction (int sig, if (get_user(u_handler, &act->sa_handler) || __get_user(new_ka.sa.sa_flags, &act->sa_flags)) return -EFAULT; - new_ka.sa.sa_handler = (void *) (long) u_handler; + new_ka.sa.sa_handler = compat_ptr(u_handler); __get_user(mask, &act->sa_mask); new_ka.sa.sa_restorer = NULL; new_ka.ka_restorer = NULL; diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c index b4fb0fbef403..473901974d99 100644 --- a/arch/sparc64/kernel/traps.c +++ b/arch/sparc64/kernel/traps.c @@ -93,7 +93,7 @@ void bad_trap (struct pt_regs *regs, long lvl) info.si_signo = SIGILL; info.si_errno = 0; info.si_code = ILL_ILLTRP; - info.si_addr = (void *)regs->tpc; + info.si_addr = (void __user *)regs->tpc; info.si_trapno = lvl; force_sig_info(SIGILL, &info, current); } @@ -133,7 +133,7 @@ void instruction_access_exception(struct pt_regs *regs, info.si_signo = SIGSEGV; info.si_errno = 0; info.si_code = SEGV_MAPERR; - info.si_addr = (void *)regs->tpc; + info.si_addr = (void __user *)regs->tpc; info.si_trapno = 0; force_sig_info(SIGSEGV, &info, current); } @@ -176,7 +176,7 @@ void data_access_exception (struct pt_regs *regs, info.si_signo = SIGSEGV; info.si_errno = 0; info.si_code = SEGV_MAPERR; - info.si_addr = (void *)sfar; + info.si_addr = (void __user *)sfar; info.si_trapno = 0; force_sig_info(SIGSEGV, &info, current); } @@ -1617,7 +1617,7 @@ void do_fpe_common(struct pt_regs *regs) } info.si_signo = SIGFPE; info.si_errno = 0; - info.si_addr = (void *)regs->tpc; + info.si_addr = (void __user *)regs->tpc; info.si_trapno = 0; info.si_code = __SI_FAULT; if ((fsr & 0x1c000) == (1 << 14)) { @@ -1672,7 +1672,7 @@ void do_tof(struct pt_regs *regs) info.si_signo = SIGEMT; info.si_errno = 0; info.si_code = EMT_TAGOVF; - info.si_addr = (void *)regs->tpc; + info.si_addr = (void __user *)regs->tpc; info.si_trapno = 0; force_sig_info(SIGEMT, &info, current); } @@ -1690,7 +1690,7 @@ void do_div0(struct pt_regs *regs) info.si_signo = SIGFPE; info.si_errno = 0; info.si_code = FPE_INTDIV; - info.si_addr = (void *)regs->tpc; + info.si_addr = (void __user *)regs->tpc; info.si_trapno = 0; force_sig_info(SIGFPE, &info, current); } @@ -1850,7 +1850,7 @@ void do_illegal_instruction(struct pt_regs *regs) info.si_signo = SIGILL; info.si_errno = 0; info.si_code = ILL_ILLOPC; - info.si_addr = (void *)pc; + info.si_addr = (void __user *)pc; info.si_trapno = 0; force_sig_info(SIGILL, &info, current); } @@ -1872,7 +1872,7 @@ void mem_address_unaligned(struct pt_regs *regs, unsigned long sfar, unsigned lo info.si_signo = SIGBUS; info.si_errno = 0; info.si_code = BUS_ADRALN; - info.si_addr = (void *)sfar; + info.si_addr = (void __user *)sfar; info.si_trapno = 0; force_sig_info(SIGBUS, &info, current); } @@ -1888,7 +1888,7 @@ void do_privop(struct pt_regs *regs) info.si_signo = SIGILL; info.si_errno = 0; info.si_code = ILL_PRVOPC; - info.si_addr = (void *)regs->tpc; + info.si_addr = (void __user *)regs->tpc; info.si_trapno = 0; force_sig_info(SIGILL, &info, current); } diff --git a/arch/sparc64/mm/fault.c b/arch/sparc64/mm/fault.c index ac57b9e7960d..640c46ede079 100644 --- a/arch/sparc64/mm/fault.c +++ b/arch/sparc64/mm/fault.c @@ -218,9 +218,9 @@ static void do_fault_siginfo(int code, int sig, struct pt_regs *regs, info.si_signo = sig; info.si_errno = 0; if (fault_code & FAULT_CODE_ITLB) - info.si_addr = (void *) regs->tpc; + info.si_addr = (void __user *) regs->tpc; else - info.si_addr = (void *) + info.si_addr = (void __user *) compute_effective_address(regs, insn, 0); info.si_trapno = 0; force_sig_info(sig, &info, current); diff --git a/arch/x86_64/ia32/ia32_signal.c b/arch/x86_64/ia32/ia32_signal.c index 2fe68d976450..5716c8bec3ce 100644 --- a/arch/x86_64/ia32/ia32_signal.c +++ b/arch/x86_64/ia32/ia32_signal.c @@ -109,7 +109,7 @@ int ia32_copy_siginfo_from_user(siginfo_t *to, siginfo_t32 __user *from) err |= __get_user(to->si_pid, &from->si_pid); err |= __get_user(to->si_uid, &from->si_uid); err |= __get_user(ptr32, &from->si_ptr); - to->si_ptr = (void*)(u64)ptr32; + to->si_ptr = compat_ptr(ptr32); return err; } @@ -146,12 +146,12 @@ sys32_sigaltstack(const stack_ia32_t __user *uss_ptr, if (uss_ptr) { u32 ptr; memset(&uss,0,sizeof(stack_t)); - if (!access_ok(VERIFY_READ,uss_ptr,sizeof(stack_ia32_t)) || - __get_user(ptr, &uss_ptr->ss_sp) || - __get_user(uss.ss_flags, &uss_ptr->ss_flags) || - __get_user(uss.ss_size, &uss_ptr->ss_size)) - return -EFAULT; - uss.ss_sp = (void *)(u64)ptr; + if (!access_ok(VERIFY_READ,uss_ptr,sizeof(stack_ia32_t)) || + __get_user(ptr, &uss_ptr->ss_sp) || + __get_user(uss.ss_flags, &uss_ptr->ss_flags) || + __get_user(uss.ss_size, &uss_ptr->ss_size)) + return -EFAULT; + uss.ss_sp = compat_ptr(ptr); } seg = get_fs(); set_fs(KERNEL_DS); @@ -448,7 +448,7 @@ void ia32_setup_frame(int sig, struct k_sigaction *ka, /* Return stub is in 32bit vsyscall page */ { - void *restorer = VSYSCALL32_SIGRETURN; + void __user *restorer = VSYSCALL32_SIGRETURN; if (ka->sa.sa_flags & SA_RESTORER) restorer = ka->sa.sa_restorer; err |= __put_user(ptr_to_u32(restorer), &frame->pretcode); @@ -541,7 +541,7 @@ void ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, { - void *restorer = VSYSCALL32_RTSIGRETURN; + void __user *restorer = VSYSCALL32_RTSIGRETURN; if (ka->sa.sa_flags & SA_RESTORER) restorer = ka->sa.sa_restorer; err |= __put_user(ptr_to_u32(restorer), &frame->pretcode); diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c index 9e215c9c753e..21c3e517c24a 100644 --- a/arch/x86_64/kernel/traps.c +++ b/arch/x86_64/kernel/traps.c @@ -448,7 +448,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ info.si_signo = signr; \ info.si_errno = 0; \ info.si_code = sicode; \ - info.si_addr = (void *)siaddr; \ + info.si_addr = (void __user *)siaddr; \ if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) == NOTIFY_BAD) \ return; \ do_trap(trapnr, signr, str, regs, error_code, &info); \ @@ -662,7 +662,7 @@ asmlinkage void *do_debug(struct pt_regs * regs, unsigned long error_code) if ((regs->cs & 3) == 0) goto clear_dr7; - info.si_addr = (void *)regs->rip; + info.si_addr = (void __user *)regs->rip; force_sig_info(SIGTRAP, &info, tsk); clear_dr7: asm volatile("movq %0,%%db7"::"r"(0UL)); @@ -686,7 +686,7 @@ clear_TF: * the correct behaviour even in the presence of the asynchronous * IRQ13 behaviour */ -void math_error(void *rip) +void math_error(void __user *rip) { struct task_struct * task; siginfo_t info; @@ -743,7 +743,7 @@ void math_error(void *rip) asmlinkage void do_coprocessor_error(struct pt_regs * regs) { conditional_sti(regs); - math_error((void *)regs->rip); + math_error((void __user *)regs->rip); } asmlinkage void bad_intr(void) @@ -751,7 +751,7 @@ asmlinkage void bad_intr(void) printk("bad interrupt"); } -static inline void simd_math_error(void *rip) +static inline void simd_math_error(void __user *rip) { struct task_struct * task; siginfo_t info; @@ -802,7 +802,7 @@ static inline void simd_math_error(void *rip) asmlinkage void do_simd_coprocessor_error(struct pt_regs * regs) { conditional_sti(regs); - simd_math_error((void *)regs->rip); + simd_math_error((void __user *)regs->rip); } asmlinkage void do_spurious_interrupt_bug(struct pt_regs * regs) diff --git a/arch/x86_64/mm/fault.c b/arch/x86_64/mm/fault.c index 2cdf34b99050..32a1d0ce9df6 100644 --- a/arch/x86_64/mm/fault.c +++ b/arch/x86_64/mm/fault.c @@ -389,7 +389,7 @@ bad_area_nosemaphore: info.si_signo = SIGSEGV; info.si_errno = 0; /* info.si_code has been set above */ - info.si_addr = (void *)address; + info.si_addr = (void __user *)address; force_sig_info(SIGSEGV, &info, tsk); return; } @@ -463,7 +463,7 @@ do_sigbus: info.si_signo = SIGBUS; info.si_errno = 0; info.si_code = BUS_ADRERR; - info.si_addr = (void *)address; + info.si_addr = (void __user *)address; force_sig_info(SIGBUS, &info, tsk); return; diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index e5ac6f83dbe1..6f969a4da8e9 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -269,7 +269,7 @@ static void async_completed(struct urb *urb, struct pt_regs *regs) sinfo.si_signo = as->signr; sinfo.si_errno = as->urb->status; sinfo.si_code = SI_ASYNCIO; - sinfo.si_addr = (void *)as->userurb; + sinfo.si_addr = as->userurb; send_sig_info(as->signr, &sinfo, as->task); } wake_up(&ps->wait); diff --git a/include/asm-alpha/signal.h b/include/asm-alpha/signal.h index 37f1742ff584..25f98bc5576f 100644 --- a/include/asm-alpha/signal.h +++ b/include/asm-alpha/signal.h @@ -128,7 +128,11 @@ typedef unsigned long sigset_t; #define SIG_SETMASK 3 /* for setting the signal mask */ /* Type of a signal handler. */ -typedef void (*__sighandler_t)(int); +typedef void __signalfn_t(int); +typedef __signalfn_t __user *__sighandler_t; + +typedef void __restorefn_t(void); +typedef __restorefn_t __user *__sigrestore_t; #define SIG_DFL ((__sighandler_t)0) /* default signal handling */ #define SIG_IGN ((__sighandler_t)1) /* ignore signal */ @@ -149,7 +153,7 @@ struct sigaction { struct k_sigaction { struct sigaction sa; - void (*ka_restorer)(void); + __sigrestore_t ka_restorer; }; #else /* Here we must cater to libcs that poke about in kernel headers. */ @@ -169,7 +173,7 @@ struct sigaction { #endif /* __KERNEL__ */ typedef struct sigaltstack { - void *ss_sp; + void __user *ss_sp; int ss_flags; size_t ss_size; } stack_t; @@ -179,7 +183,7 @@ typedef struct sigaltstack { implemented here for OSF/1 compatibility. */ struct sigstack { - void *ss_sp; + void __user *ss_sp; int ss_onstack; }; diff --git a/include/asm-generic/siginfo.h b/include/asm-generic/siginfo.h index fe02b1a4d286..f757d2d51e7f 100644 --- a/include/asm-generic/siginfo.h +++ b/include/asm-generic/siginfo.h @@ -6,7 +6,7 @@ typedef union sigval { int sival_int; - void *sival_ptr; + void __user *sival_ptr; } sigval_t; /* @@ -78,7 +78,7 @@ typedef struct siginfo { /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ struct { - void *_addr; /* faulting insn/memory ref. */ + void __user *_addr; /* faulting insn/memory ref. */ #ifdef __ARCH_SI_TRAPNO int _trapno; /* TRAP # which caused the signal */ #endif diff --git a/include/asm-sparc64/signal.h b/include/asm-sparc64/signal.h index 1673945ea5a1..de2bb39b8b59 100644 --- a/include/asm-sparc64/signal.h +++ b/include/asm-sparc64/signal.h @@ -186,9 +186,14 @@ struct sigstack { /* Type of a signal handler. */ #ifdef __KERNEL__ -typedef void (*__sighandler_t)(int, struct sigcontext *); +typedef void __signalfn_t(int); +typedef __signalfn_t __user *__sighandler_t; + +typedef void __restorefn_t(void); +typedef __restorefn_t __user *__sigrestore_t; #else typedef void (*__sighandler_t)(int); +typedef void (*__sigrestore_t)(void); #endif #define SIG_DFL ((__sighandler_t)0) /* default signal handling */ @@ -198,7 +203,7 @@ typedef void (*__sighandler_t)(int); struct __new_sigaction { __sighandler_t sa_handler; unsigned long sa_flags; - void (*sa_restorer)(void); /* not used by Linux/SPARC yet */ + __sigrestore_t sa_restorer; /* not used by Linux/SPARC yet */ __new_sigset_t sa_mask; }; @@ -233,7 +238,7 @@ struct __old_sigaction32 { #endif typedef struct sigaltstack { - void *ss_sp; + void __user *ss_sp; int ss_flags; size_t ss_size; } stack_t; diff --git a/include/asm-x86_64/signal.h b/include/asm-x86_64/signal.h index 21c4bf716666..643a20d73765 100644 --- a/include/asm-x86_64/signal.h +++ b/include/asm-x86_64/signal.h @@ -136,7 +136,11 @@ typedef unsigned long sigset_t; #ifndef __ASSEMBLY__ /* Type of a signal handler. */ -typedef void (*__sighandler_t)(int); +typedef void __signalfn_t(int); +typedef __signalfn_t __user *__sighandler_t; + +typedef void __restorefn_t(void); +typedef __restorefn_t __user *__sigrestore_t; #define SIG_DFL ((__sighandler_t)0) /* default signal handling */ #define SIG_IGN ((__sighandler_t)1) /* ignore signal */ @@ -145,7 +149,7 @@ typedef void (*__sighandler_t)(int); struct sigaction { __sighandler_t sa_handler; unsigned long sa_flags; - void (*sa_restorer)(void); + __sigrestore_t sa_restorer; sigset_t sa_mask; /* mask last for extensibility */ }; @@ -154,7 +158,7 @@ struct k_sigaction { }; typedef struct sigaltstack { - void *ss_sp; + void __user *ss_sp; int ss_flags; size_t ss_size; } stack_t; diff --git a/include/asm-x86_64/vsyscall32.h b/include/asm-x86_64/vsyscall32.h index c44a49d4334a..c631c082f8f7 100644 --- a/include/asm-x86_64/vsyscall32.h +++ b/include/asm-x86_64/vsyscall32.h @@ -13,8 +13,8 @@ #define VSYSCALL32_VSYSCALL ((void *)VSYSCALL32_BASE + 0x400) #define VSYSCALL32_SYSEXIT ((void *)VSYSCALL32_BASE + 0x410) -#define VSYSCALL32_SIGRETURN ((void *)VSYSCALL32_BASE + 0x500) -#define VSYSCALL32_RTSIGRETURN ((void *)VSYSCALL32_BASE + 0x600) +#define VSYSCALL32_SIGRETURN ((void __user *)VSYSCALL32_BASE + 0x500) +#define VSYSCALL32_RTSIGRETURN ((void __user *)VSYSCALL32_BASE + 0x600) #endif #endif diff --git a/kernel/exit.c b/kernel/exit.c index 2bab0bf9fe97..5d13c054d256 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -296,7 +296,7 @@ int allow_signal(int sig) Let the signal code know it'll be handled, so that they don't get converted to SIGKILL or just silently dropped */ - current->sighand->action[(sig)-1].sa.sa_handler = (void *)2; + current->sighand->action[(sig)-1].sa.sa_handler = (void __user *)2; } recalc_sigpending(); spin_unlock_irq(¤t->sighand->siglock); |
