lkml.org 
[lkml]   [2020]   [Jan]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1 4/6] powerpc/32s: Drop NULL addr verification
    Date
    NULL addr is a user address. Don't waste time checking it. If
    someone tries to access it, it will SIGFAULT the same way as for
    address 1, so no need to make it special.

    The special case is when not doing a write, in that case we want
    to drop the entire function. This is now handled by 'dir' param
    and not by the nulity of 'to' anymore.

    Also make beginning of prevent_user_access() similar
    to beginning of allow_user_access(), and tell the compiler
    that writing in kernel space or with a 0 length is unlikely

    Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
    ---
    arch/powerpc/include/asm/book3s/32/kup.h | 10 ++++++----
    1 file changed, 6 insertions(+), 4 deletions(-)

    diff --git a/arch/powerpc/include/asm/book3s/32/kup.h b/arch/powerpc/include/asm/book3s/32/kup.h
    index d765515bd1c1..3c1798e56b55 100644
    --- a/arch/powerpc/include/asm/book3s/32/kup.h
    +++ b/arch/powerpc/include/asm/book3s/32/kup.h
    @@ -113,7 +113,7 @@ static __always_inline void allow_user_access(void __user *to, const void __user

    addr = (__force u32)to;

    - if (!addr || addr >= TASK_SIZE || !size)
    + if (unlikely(addr >= TASK_SIZE || !size))
    return;

    end = min(addr + size, TASK_SIZE);
    @@ -124,16 +124,18 @@ static __always_inline void allow_user_access(void __user *to, const void __user
    static __always_inline void prevent_user_access(void __user *to, const void __user *from,
    u32 size, unsigned long dir)
    {
    - u32 addr = (__force u32)to;
    - u32 end = min(addr + size, TASK_SIZE);
    + u32 addr, end;

    BUILD_BUG_ON(!__builtin_constant_p(dir));
    if (!(dir & KUAP_W))
    return;

    - if (!addr || addr >= TASK_SIZE || !size)
    + addr = (__force u32)to;
    +
    + if (unlikely(addr >= TASK_SIZE || !size))
    return;

    + end = min(addr + size, TASK_SIZE);
    current->thread.kuap = 0;
    kuap_update_sr(mfsrin(addr) | SR_KS, addr, end); /* set Ks */
    }
    --
    2.25.0
    \
     
     \ /
      Last update: 2020-01-22 14:01    [W:2.889 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site