lkml.org 
[lkml]   [2016]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 113/119] openrisc: fix copy_from_user()
    Date
    From: Al Viro <viro@zeniv.linux.org.uk>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit acb2505d0119033a80c85ac8d02dccae41271667 upstream.

    ... that should zero on faults. Also remove the <censored> helpful
    logics wrt range truncation copied from ppc32. Where it had ever
    been needed only in case of copy_from_user() *and* had not been merged
    into the mainline until a month after the need had disappeared.
    A decade before openrisc went into mainline, I might add...

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    arch/openrisc/include/asm/uaccess.h | 35 +++++++++++------------------------
    1 file changed, 11 insertions(+), 24 deletions(-)

    diff --git a/arch/openrisc/include/asm/uaccess.h b/arch/openrisc/include/asm/uaccess.h
    index ab2e7a198a4c..908c0904bdd6 100644
    --- a/arch/openrisc/include/asm/uaccess.h
    +++ b/arch/openrisc/include/asm/uaccess.h
    @@ -273,28 +273,20 @@ __copy_tofrom_user(void *to, const void *from, unsigned long size);
    static inline unsigned long
    copy_from_user(void *to, const void *from, unsigned long n)
    {
    - unsigned long over;
    -
    - if (access_ok(VERIFY_READ, from, n))
    - return __copy_tofrom_user(to, from, n);
    - if ((unsigned long)from < TASK_SIZE) {
    - over = (unsigned long)from + n - TASK_SIZE;
    - return __copy_tofrom_user(to, from, n - over) + over;
    - }
    - return n;
    + unsigned long res = n;
    +
    + if (likely(access_ok(VERIFY_READ, from, n)))
    + n = __copy_tofrom_user(to, from, n);
    + if (unlikely(res))
    + memset(to + (n - res), 0, res);
    + return res;
    }

    static inline unsigned long
    copy_to_user(void *to, const void *from, unsigned long n)
    {
    - unsigned long over;
    -
    - if (access_ok(VERIFY_WRITE, to, n))
    - return __copy_tofrom_user(to, from, n);
    - if ((unsigned long)to < TASK_SIZE) {
    - over = (unsigned long)to + n - TASK_SIZE;
    - return __copy_tofrom_user(to, from, n - over) + over;
    - }
    + if (likely(access_ok(VERIFY_WRITE, to, n)))
    + n = __copy_tofrom_user(to, from, n);
    return n;
    }

    @@ -303,13 +295,8 @@ extern unsigned long __clear_user(void *addr, unsigned long size);
    static inline __must_check unsigned long
    clear_user(void *addr, unsigned long size)
    {
    -
    - if (access_ok(VERIFY_WRITE, addr, size))
    - return __clear_user(addr, size);
    - if ((unsigned long)addr < TASK_SIZE) {
    - unsigned long over = (unsigned long)addr + size - TASK_SIZE;
    - return __clear_user(addr, size - over) + over;
    - }
    + if (likely(access_ok(VERIFY_WRITE, addr, size)))
    + size = __clear_user(addr, size);
    return size;
    }

    --
    2.10.0
    \
     
     \ /
      Last update: 2016-09-29 12:32    [W:4.281 / U:0.660 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site