#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset);
-void signal_fault(struct pt_regs *regs, void *frame, char *where);
+void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
int ia32_copy_siginfo_to_user(siginfo_t32 __user *to, siginfo_t *from)
{
int ia32_copy_siginfo_from_user(siginfo_t *to, siginfo_t32 __user *from)
{
int err;
+ u32 ptr32;
if (!access_ok (VERIFY_READ, from, sizeof(siginfo_t32)))
return -EFAULT;
err |= __get_user(to->si_pid, &from->si_pid);
err |= __get_user(to->si_uid, &from->si_uid);
- err |= __get_user((u32)(u64)to->si_ptr, &from->si_ptr);
+ err |= __get_user(ptr32, &from->si_ptr);
+ to->si_ptr = (void*)(u64)ptr32;
return err;
}
}
asmlinkage long
-sys32_sigaltstack(const stack_ia32_t *uss_ptr, stack_ia32_t *uoss_ptr,
- struct pt_regs regs)
+sys32_sigaltstack(const stack_ia32_t __user *uss_ptr,
+ stack_ia32_t __user *uoss_ptr,
+ struct pt_regs regs)
{
stack_t uss,uoss;
int ret;
};
static int
-ia32_restore_sigcontext(struct pt_regs *regs, struct sigcontext_ia32 *sc, unsigned int *peax)
+ia32_restore_sigcontext(struct pt_regs *regs, struct sigcontext_ia32 __user *sc, unsigned int *peax)
{
unsigned int err = 0;
{
u32 tmp;
- struct _fpstate_ia32 * buf;
+ struct _fpstate_ia32 __user * buf;
err |= __get_user(tmp, &sc->fpstate);
- buf = (struct _fpstate_ia32 *) (u64)tmp;
+ buf = compat_ptr(tmp);
if (buf) {
if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
goto badframe;
asmlinkage long sys32_sigreturn(struct pt_regs regs)
{
- struct sigframe *frame = (struct sigframe *)(regs.rsp - 8);
+ struct sigframe __user *frame = (struct sigframe __user *)(regs.rsp-8);
sigset_t set;
unsigned int eax;
asmlinkage long sys32_rt_sigreturn(struct pt_regs regs)
{
- struct rt_sigframe *frame = (struct rt_sigframe *)(regs.rsp - 4);
+ struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(regs.rsp - 4);
sigset_t set;
- stack_t st;
unsigned int eax;
if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
if (ia32_restore_sigcontext(®s, &frame->uc.uc_mcontext, &eax))
goto badframe;
- if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
+ if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, regs) == -EFAULT)
goto badframe;
- /* It is more difficult to avoid calling this function than to
- call it and ignore errors. */
- {
- mm_segment_t oldds = get_fs();
- set_fs(KERNEL_DS);
- do_sigaltstack(&st, NULL, regs.rsp);
- set_fs(oldds);
- }
return eax;
*/
static int
-ia32_setup_sigcontext(struct sigcontext_ia32 *sc, struct _fpstate_ia32 *fpstate,
+ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc, struct _fpstate_ia32 __user *fpstate,
struct pt_regs *regs, unsigned int mask)
{
int tmp, err = 0;
tmp = 0;
__asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
- err |= __put_user(tmp, (unsigned int *)&sc->gs);
+ err |= __put_user(tmp, (unsigned int __user *)&sc->gs);
__asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
- err |= __put_user(tmp, (unsigned int *)&sc->fs);
+ err |= __put_user(tmp, (unsigned int __user *)&sc->fs);
__asm__("movl %%ds,%0" : "=r"(tmp): "0"(tmp));
- err |= __put_user(tmp, (unsigned int *)&sc->ds);
+ err |= __put_user(tmp, (unsigned int __user *)&sc->ds);
__asm__("movl %%es,%0" : "=r"(tmp): "0"(tmp));
- err |= __put_user(tmp, (unsigned int *)&sc->es);
+ err |= __put_user(tmp, (unsigned int __user *)&sc->es);
err |= __put_user((u32)regs->rdi, &sc->edi);
err |= __put_user((u32)regs->rsi, &sc->esi);
/*
* Determine which stack to use..
*/
-static void *
+static void __user *
get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
{
unsigned long rsp;
rsp = (unsigned long) ka->sa.sa_restorer;
}
- return (void *)((rsp - frame_size) & -8UL);
+ return (void __user *)((rsp - frame_size) & -8UL);
}
void ia32_setup_frame(int sig, struct k_sigaction *ka,
compat_sigset_t *set, struct pt_regs * regs)
{
- struct sigframe *frame;
+ struct sigframe __user *frame;
int err = 0;
frame = get_sigframe(ka, regs, sizeof(*frame));
void ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
compat_sigset_t *set, struct pt_regs * regs)
{
- struct rt_sigframe *frame;
+ struct rt_sigframe __user *frame;
int err = 0;
frame = get_sigframe(ka, regs, sizeof(*frame));