提交 2382f77f 编写于 作者: A Al Viro 提交者: Linus Torvalds

[PATCH] m68k: signal __user annotations

Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
Cc: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 11c40f8a
...@@ -96,7 +96,7 @@ asmlinkage int do_sigsuspend(struct pt_regs *regs) ...@@ -96,7 +96,7 @@ asmlinkage int do_sigsuspend(struct pt_regs *regs)
asmlinkage int asmlinkage int
do_rt_sigsuspend(struct pt_regs *regs) do_rt_sigsuspend(struct pt_regs *regs)
{ {
sigset_t *unewset = (sigset_t *)regs->d1; sigset_t __user *unewset = (sigset_t __user *)regs->d1;
size_t sigsetsize = (size_t)regs->d2; size_t sigsetsize = (size_t)regs->d2;
sigset_t saveset, newset; sigset_t saveset, newset;
...@@ -122,8 +122,8 @@ do_rt_sigsuspend(struct pt_regs *regs) ...@@ -122,8 +122,8 @@ do_rt_sigsuspend(struct pt_regs *regs)
} }
asmlinkage int asmlinkage int
sys_sigaction(int sig, const struct old_sigaction *act, sys_sigaction(int sig, const struct old_sigaction __user *act,
struct old_sigaction *oact) struct old_sigaction __user *oact)
{ {
struct k_sigaction new_ka, old_ka; struct k_sigaction new_ka, old_ka;
int ret; int ret;
...@@ -154,7 +154,7 @@ sys_sigaction(int sig, const struct old_sigaction *act, ...@@ -154,7 +154,7 @@ sys_sigaction(int sig, const struct old_sigaction *act,
} }
asmlinkage int asmlinkage int
sys_sigaltstack(const stack_t *uss, stack_t *uoss) sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
{ {
return do_sigaltstack(uss, uoss, rdusp()); return do_sigaltstack(uss, uoss, rdusp());
} }
...@@ -169,10 +169,10 @@ sys_sigaltstack(const stack_t *uss, stack_t *uoss) ...@@ -169,10 +169,10 @@ sys_sigaltstack(const stack_t *uss, stack_t *uoss)
struct sigframe struct sigframe
{ {
char *pretcode; char __user *pretcode;
int sig; int sig;
int code; int code;
struct sigcontext *psc; struct sigcontext __user *psc;
char retcode[8]; char retcode[8];
unsigned long extramask[_NSIG_WORDS-1]; unsigned long extramask[_NSIG_WORDS-1];
struct sigcontext sc; struct sigcontext sc;
...@@ -180,10 +180,10 @@ struct sigframe ...@@ -180,10 +180,10 @@ struct sigframe
struct rt_sigframe struct rt_sigframe
{ {
char *pretcode; char __user *pretcode;
int sig; int sig;
struct siginfo *pinfo; struct siginfo __user *pinfo;
void *puc; void __user *puc;
char retcode[8]; char retcode[8];
struct siginfo info; struct siginfo info;
struct ucontext uc; struct ucontext uc;
...@@ -248,7 +248,7 @@ static inline int restore_fpu_state(struct sigcontext *sc) ...@@ -248,7 +248,7 @@ static inline int restore_fpu_state(struct sigcontext *sc)
#define uc_formatvec uc_filler[FPCONTEXT_SIZE/4] #define uc_formatvec uc_filler[FPCONTEXT_SIZE/4]
#define uc_extra uc_filler[FPCONTEXT_SIZE/4+1] #define uc_extra uc_filler[FPCONTEXT_SIZE/4+1]
static inline int rt_restore_fpu_state(struct ucontext *uc) static inline int rt_restore_fpu_state(struct ucontext __user *uc)
{ {
unsigned char fpstate[FPCONTEXT_SIZE]; unsigned char fpstate[FPCONTEXT_SIZE];
int context_size = CPU_IS_060 ? 8 : 0; int context_size = CPU_IS_060 ? 8 : 0;
...@@ -267,7 +267,7 @@ static inline int rt_restore_fpu_state(struct ucontext *uc) ...@@ -267,7 +267,7 @@ static inline int rt_restore_fpu_state(struct ucontext *uc)
return 0; return 0;
} }
if (__get_user(*(long *)fpstate, (long *)&uc->uc_fpstate)) if (__get_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate))
goto out; goto out;
if (CPU_IS_060 ? fpstate[2] : fpstate[0]) { if (CPU_IS_060 ? fpstate[2] : fpstate[0]) {
if (!CPU_IS_060) if (!CPU_IS_060)
...@@ -306,7 +306,7 @@ static inline int rt_restore_fpu_state(struct ucontext *uc) ...@@ -306,7 +306,7 @@ static inline int rt_restore_fpu_state(struct ucontext *uc)
"m" (*fpregs.f_fpcntl)); "m" (*fpregs.f_fpcntl));
} }
if (context_size && if (context_size &&
__copy_from_user(fpstate + 4, (long *)&uc->uc_fpstate + 1, __copy_from_user(fpstate + 4, (long __user *)&uc->uc_fpstate + 1,
context_size)) context_size))
goto out; goto out;
__asm__ volatile (".chip 68k/68881\n\t" __asm__ volatile (".chip 68k/68881\n\t"
...@@ -319,7 +319,7 @@ static inline int rt_restore_fpu_state(struct ucontext *uc) ...@@ -319,7 +319,7 @@ static inline int rt_restore_fpu_state(struct ucontext *uc)
} }
static inline int static inline int
restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc, void *fp, restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __user *fp,
int *pd0) int *pd0)
{ {
int fsize, formatvec; int fsize, formatvec;
...@@ -404,10 +404,10 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc, void *fp, ...@@ -404,10 +404,10 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc, void *fp,
static inline int static inline int
rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw, rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
struct ucontext *uc, int *pd0) struct ucontext __user *uc, int *pd0)
{ {
int fsize, temp; int fsize, temp;
greg_t *gregs = uc->uc_mcontext.gregs; greg_t __user *gregs = uc->uc_mcontext.gregs;
unsigned long usp; unsigned long usp;
int err; int err;
...@@ -506,7 +506,7 @@ asmlinkage int do_sigreturn(unsigned long __unused) ...@@ -506,7 +506,7 @@ asmlinkage int do_sigreturn(unsigned long __unused)
struct switch_stack *sw = (struct switch_stack *) &__unused; struct switch_stack *sw = (struct switch_stack *) &__unused;
struct pt_regs *regs = (struct pt_regs *) (sw + 1); struct pt_regs *regs = (struct pt_regs *) (sw + 1);
unsigned long usp = rdusp(); unsigned long usp = rdusp();
struct sigframe *frame = (struct sigframe *)(usp - 4); struct sigframe __user *frame = (struct sigframe __user *)(usp - 4);
sigset_t set; sigset_t set;
int d0; int d0;
...@@ -536,7 +536,7 @@ asmlinkage int do_rt_sigreturn(unsigned long __unused) ...@@ -536,7 +536,7 @@ asmlinkage int do_rt_sigreturn(unsigned long __unused)
struct switch_stack *sw = (struct switch_stack *) &__unused; struct switch_stack *sw = (struct switch_stack *) &__unused;
struct pt_regs *regs = (struct pt_regs *) (sw + 1); struct pt_regs *regs = (struct pt_regs *) (sw + 1);
unsigned long usp = rdusp(); unsigned long usp = rdusp();
struct rt_sigframe *frame = (struct rt_sigframe *)(usp - 4); struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(usp - 4);
sigset_t set; sigset_t set;
int d0; int d0;
...@@ -596,7 +596,7 @@ static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs) ...@@ -596,7 +596,7 @@ static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs)
} }
} }
static inline int rt_save_fpu_state(struct ucontext *uc, struct pt_regs *regs) static inline int rt_save_fpu_state(struct ucontext __user *uc, struct pt_regs *regs)
{ {
unsigned char fpstate[FPCONTEXT_SIZE]; unsigned char fpstate[FPCONTEXT_SIZE];
int context_size = CPU_IS_060 ? 8 : 0; int context_size = CPU_IS_060 ? 8 : 0;
...@@ -617,7 +617,7 @@ static inline int rt_save_fpu_state(struct ucontext *uc, struct pt_regs *regs) ...@@ -617,7 +617,7 @@ static inline int rt_save_fpu_state(struct ucontext *uc, struct pt_regs *regs)
".chip 68k" ".chip 68k"
: : "m" (*fpstate) : "memory"); : : "m" (*fpstate) : "memory");
err |= __put_user(*(long *)fpstate, (long *)&uc->uc_fpstate); err |= __put_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate);
if (CPU_IS_060 ? fpstate[2] : fpstate[0]) { if (CPU_IS_060 ? fpstate[2] : fpstate[0]) {
fpregset_t fpregs; fpregset_t fpregs;
if (!CPU_IS_060) if (!CPU_IS_060)
...@@ -642,7 +642,7 @@ static inline int rt_save_fpu_state(struct ucontext *uc, struct pt_regs *regs) ...@@ -642,7 +642,7 @@ static inline int rt_save_fpu_state(struct ucontext *uc, struct pt_regs *regs)
sizeof(fpregs)); sizeof(fpregs));
} }
if (context_size) if (context_size)
err |= copy_to_user((long *)&uc->uc_fpstate + 1, fpstate + 4, err |= copy_to_user((long __user *)&uc->uc_fpstate + 1, fpstate + 4,
context_size); context_size);
return err; return err;
} }
...@@ -662,10 +662,10 @@ static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs, ...@@ -662,10 +662,10 @@ static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
save_fpu_state(sc, regs); save_fpu_state(sc, regs);
} }
static inline int rt_setup_ucontext(struct ucontext *uc, struct pt_regs *regs) static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *regs)
{ {
struct switch_stack *sw = (struct switch_stack *)regs - 1; struct switch_stack *sw = (struct switch_stack *)regs - 1;
greg_t *gregs = uc->uc_mcontext.gregs; greg_t __user *gregs = uc->uc_mcontext.gregs;
int err = 0; int err = 0;
err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version); err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version);
...@@ -753,7 +753,7 @@ static inline void push_cache (unsigned long vaddr) ...@@ -753,7 +753,7 @@ static inline void push_cache (unsigned long vaddr)
} }
} }
static inline void * static inline void __user *
get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
{ {
unsigned long usp; unsigned long usp;
...@@ -766,13 +766,13 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) ...@@ -766,13 +766,13 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
if (!on_sig_stack(usp)) if (!on_sig_stack(usp))
usp = current->sas_ss_sp + current->sas_ss_size; usp = current->sas_ss_sp + current->sas_ss_size;
} }
return (void *)((usp - frame_size) & -8UL); return (void __user *)((usp - frame_size) & -8UL);
} }
static void setup_frame (int sig, struct k_sigaction *ka, static void setup_frame (int sig, struct k_sigaction *ka,
sigset_t *set, struct pt_regs *regs) sigset_t *set, struct pt_regs *regs)
{ {
struct sigframe *frame; struct sigframe __user *frame;
int fsize = frame_extra_sizes[regs->format]; int fsize = frame_extra_sizes[regs->format];
struct sigcontext context; struct sigcontext context;
int err = 0; int err = 0;
...@@ -813,7 +813,7 @@ static void setup_frame (int sig, struct k_sigaction *ka, ...@@ -813,7 +813,7 @@ static void setup_frame (int sig, struct k_sigaction *ka,
err |= __put_user(frame->retcode, &frame->pretcode); err |= __put_user(frame->retcode, &frame->pretcode);
/* moveq #,d0; trap #0 */ /* moveq #,d0; trap #0 */
err |= __put_user(0x70004e40 + (__NR_sigreturn << 16), err |= __put_user(0x70004e40 + (__NR_sigreturn << 16),
(long *)(frame->retcode)); (long __user *)(frame->retcode));
if (err) if (err)
goto give_sigsegv; goto give_sigsegv;
...@@ -849,7 +849,7 @@ static void setup_frame (int sig, struct k_sigaction *ka, ...@@ -849,7 +849,7 @@ static void setup_frame (int sig, struct k_sigaction *ka,
static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info, static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
sigset_t *set, struct pt_regs *regs) sigset_t *set, struct pt_regs *regs)
{ {
struct rt_sigframe *frame; struct rt_sigframe __user *frame;
int fsize = frame_extra_sizes[regs->format]; int fsize = frame_extra_sizes[regs->format];
int err = 0; int err = 0;
...@@ -880,8 +880,8 @@ static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -880,8 +880,8 @@ static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
/* Create the ucontext. */ /* Create the ucontext. */
err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(0, &frame->uc.uc_flags);
err |= __put_user(0, &frame->uc.uc_link); err |= __put_user(NULL, &frame->uc.uc_link);
err |= __put_user((void *)current->sas_ss_sp, err |= __put_user((void __user *)current->sas_ss_sp,
&frame->uc.uc_stack.ss_sp); &frame->uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(rdusp()), err |= __put_user(sas_ss_flags(rdusp()),
&frame->uc.uc_stack.ss_flags); &frame->uc.uc_stack.ss_flags);
...@@ -893,8 +893,8 @@ static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -893,8 +893,8 @@ static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
err |= __put_user(frame->retcode, &frame->pretcode); err |= __put_user(frame->retcode, &frame->pretcode);
/* moveq #,d0; notb d0; trap #0 */ /* moveq #,d0; notb d0; trap #0 */
err |= __put_user(0x70004600 + ((__NR_rt_sigreturn ^ 0xff) << 16), err |= __put_user(0x70004600 + ((__NR_rt_sigreturn ^ 0xff) << 16),
(long *)(frame->retcode + 0)); (long __user *)(frame->retcode + 0));
err |= __put_user(0x4e40, (short *)(frame->retcode + 4)); err |= __put_user(0x4e40, (short __user *)(frame->retcode + 4));
if (err) if (err)
goto give_sigsegv; goto give_sigsegv;
......
...@@ -144,7 +144,7 @@ struct sigaction { ...@@ -144,7 +144,7 @@ struct sigaction {
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
typedef struct sigaltstack { typedef struct sigaltstack {
void *ss_sp; void __user *ss_sp;
int ss_flags; int ss_flags;
size_t ss_size; size_t ss_size;
} stack_t; } stack_t;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册