lkml.org 
[lkml]   [2019]   [Apr]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/fpu] x86/fpu: Fix __user annotations
    Commit-ID:  89833fab15d6017ba006a45b5af68caa067171a7
    Gitweb: https://git.kernel.org/tip/89833fab15d6017ba006a45b5af68caa067171a7
    Author: Jann Horn <jannh@google.com>
    AuthorDate: Fri, 29 Mar 2019 22:46:51 +0100
    Committer: Borislav Petkov <bp@suse.de>
    CommitDate: Wed, 3 Apr 2019 14:12:40 +0200

    x86/fpu: Fix __user annotations

    In save_xstate_epilog(), use __user when type-casting userspace
    pointers.

    In setup_sigcontext() and x32_setup_rt_frame(), cast the userspace
    pointers to 'unsigned long __user *' before writing into them. These
    pointers are originally '__u32 __user *' or '__u64 __user *', causing
    sparse to complain when a userspace pointer is written into them. The
    casts are okay because the pointers always point to pointer-sized
    values.

    Thanks to Luc Van Oostenryck and Al Viro for explaining this to me.

    Signed-off-by: Jann Horn <jannh@google.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Mukesh Ojha <mojha@codeaurora.org>
    Cc: Qiaowei Ren <qiaowei.ren@intel.com>
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: x86-ml <x86@kernel.org>
    Link: https://lkml.kernel.org/r/20190329214652.258477-3-jannh@google.com
    ---
    arch/x86/kernel/fpu/signal.c | 6 +++---
    arch/x86/kernel/signal.c | 4 ++--
    2 files changed, 5 insertions(+), 5 deletions(-)

    diff --git a/arch/x86/kernel/fpu/signal.c b/arch/x86/kernel/fpu/signal.c
    index f6a1d299627c..55b80de13ea5 100644
    --- a/arch/x86/kernel/fpu/signal.c
    +++ b/arch/x86/kernel/fpu/signal.c
    @@ -92,13 +92,13 @@ static inline int save_xstate_epilog(void __user *buf, int ia32_frame)
    return err;

    err |= __put_user(FP_XSTATE_MAGIC2,
    - (__u32 *)(buf + fpu_user_xstate_size));
    + (__u32 __user *)(buf + fpu_user_xstate_size));

    /*
    * Read the xfeatures which we copied (directly from the cpu or
    * from the state in task struct) to the user buffers.
    */
    - err |= __get_user(xfeatures, (__u32 *)&x->header.xfeatures);
    + err |= __get_user(xfeatures, (__u32 __user *)&x->header.xfeatures);

    /*
    * For legacy compatible, we always set FP/SSE bits in the bit
    @@ -113,7 +113,7 @@ static inline int save_xstate_epilog(void __user *buf, int ia32_frame)
    */
    xfeatures |= XFEATURE_MASK_FPSSE;

    - err |= __put_user(xfeatures, (__u32 *)&x->header.xfeatures);
    + err |= __put_user(xfeatures, (__u32 __user *)&x->header.xfeatures);

    return err;
    }
    diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
    index 08dfd4c1a4f9..b419e1a1a0ce 100644
    --- a/arch/x86/kernel/signal.c
    +++ b/arch/x86/kernel/signal.c
    @@ -206,7 +206,7 @@ int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate,
    put_user_ex(regs->ss, &sc->ss);
    #endif /* CONFIG_X86_32 */

    - put_user_ex(fpstate, &sc->fpstate);
    + put_user_ex(fpstate, (unsigned long __user *)&sc->fpstate);

    /* non-iBCS2 extensions.. */
    put_user_ex(mask, &sc->oldmask);
    @@ -569,7 +569,7 @@ static int x32_setup_rt_frame(struct ksignal *ksig,
    restorer = NULL;
    err |= -EFAULT;
    }
    - put_user_ex(restorer, &frame->pretcode);
    + put_user_ex(restorer, (unsigned long __user *)&frame->pretcode);
    } put_user_catch(err);

    err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
    \
     
     \ /
      Last update: 2019-04-03 14:44    [W:4.702 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site