um: don't rely on sc.fpstate not having been reassigned prior to rt_sigreturn()
authorAl Viro <viro@ftp.linux.org.uk>
Thu, 18 Aug 2011 19:00:29 +0000 (20:00 +0100)
committerRichard Weinberger <richard@nod.at>
Wed, 2 Nov 2011 13:14:41 +0000 (14:14 +0100)
native rt_sigreturn() doesn't...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/sys-x86_64/signal.c

index 581b64d86a6ce0c3c9146ff869b78624a7c3cc21..ccfa5544e92c71e25f4bc28e88ff3b3bf1aa5456 100644 (file)
@@ -44,10 +44,10 @@ void copy_sc(struct uml_pt_regs *regs, void *from)
 }
 
 static int copy_sc_from_user(struct pt_regs *regs,
-                            struct sigcontext __user *from,
-                            struct _fpstate __user *fpp)
+                            struct sigcontext __user *from)
 {
        struct user_i387_struct fp;
+       void __user *buf;
        int err = 0;
 
 #define GETREG(regs, regno, sc, regname)                               \
@@ -78,7 +78,11 @@ static int copy_sc_from_user(struct pt_regs *regs,
 
 #undef GETREG
 
-       err = copy_from_user(&fp, fpp, sizeof(struct user_i387_struct));
+       err = __get_user(buf, &from->fpstate);
+       if (err)
+               return 1;
+
+       err = copy_from_user(&fp, buf, sizeof(struct user_i387_struct));
        if (err)
                return 1;
 
@@ -272,8 +276,7 @@ long sys_rt_sigreturn(struct pt_regs *regs)
        sigdelsetmask(&set, ~_BLOCKABLE);
        set_current_blocked(&set);
 
-       if (copy_sc_from_user(&current->thread.regs, &uc->uc_mcontext,
-                             &frame->fpstate))
+       if (copy_sc_from_user(&current->thread.regs, &uc->uc_mcontext))
                goto segfault;
 
        /* Avoid ERESTART handling */