From: Al Viro Date: Thu, 18 Aug 2011 19:00:29 +0000 (+0100) Subject: um: don't rely on sc.fpstate not having been reassigned prior to rt_sigreturn() X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=3c916fec12ab614aca5cf6ec09ae3adc6b911193;p=openwrt%2Fstaging%2Fblogic.git um: don't rely on sc.fpstate not having been reassigned prior to rt_sigreturn() native rt_sigreturn() doesn't... Signed-off-by: Al Viro Signed-off-by: Richard Weinberger --- diff --git a/arch/um/sys-x86_64/signal.c b/arch/um/sys-x86_64/signal.c index 581b64d86a6c..ccfa5544e92c 100644 --- a/arch/um/sys-x86_64/signal.c +++ b/arch/um/sys-x86_64/signal.c @@ -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(¤t->thread.regs, &uc->uc_mcontext, - &frame->fpstate)) + if (copy_sc_from_user(¤t->thread.regs, &uc->uc_mcontext)) goto segfault; /* Avoid ERESTART handling */