Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2382f77f authored by Al Viro's avatar Al Viro Committed by Linus Torvalds
Browse files

[PATCH] m68k: signal __user annotations



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Cc: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 11c40f8a
Loading
Loading
Loading
Loading
+31 −31
Original line number Original line Diff line number Diff line
@@ -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)
}
}


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,
}
}


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)


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


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)
#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)
		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)
				    "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)
}
}


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,


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)
	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)
	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)
	}
	}
}
}


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)
			  ".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)
				    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,
	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)
	}
	}
}
}


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)
		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,
	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,
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,


	/* 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,
	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;
+1 −1
Original line number Original line Diff line number Diff line
@@ -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;