lkml.org 
[lkml]   [2010]   [Jan]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/urgent] x86: copy_from_user() should not return -EFAULT
    Commit-ID:  409d02ef6d74f5e91f5ea4c587b2ee1375f106fc
    Gitweb: http://git.kernel.org/tip/409d02ef6d74f5e91f5ea4c587b2ee1375f106fc
    Author: Heiko Carstens <heiko.carstens@de.ibm.com>
    AuthorDate: Tue, 5 Jan 2010 14:19:11 +0100
    Committer: H. Peter Anvin <hpa@zytor.com>
    CommitDate: Tue, 5 Jan 2010 13:45:06 -0800

    x86: copy_from_user() should not return -EFAULT

    Callers of copy_from_user() expect it to return the number of bytes
    it could not copy. In no case it is supposed to return -EFAULT.

    In case of a detected buffer overflow just return the requested
    length. In addition one could think of a memset that would clear
    the size of the target object.

    [ hpa: code is not in .32 so not needed for -stable ]

    Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
    Acked-by: Arjan van de Ven <arjan@linux.intel.com>
    LKML-Reference: <20100105131911.GC5480@osiris.boeblingen.de.ibm.com>
    Signed-off-by: H. Peter Anvin <hpa@zytor.com>
    ---
    arch/x86/include/asm/uaccess_32.h | 5 ++---
    arch/x86/include/asm/uaccess_64.h | 5 ++---
    2 files changed, 4 insertions(+), 6 deletions(-)

    diff --git a/arch/x86/include/asm/uaccess_32.h b/arch/x86/include/asm/uaccess_32.h
    index 0c9825e..088d09f 100644
    --- a/arch/x86/include/asm/uaccess_32.h
    +++ b/arch/x86/include/asm/uaccess_32.h
    @@ -205,14 +205,13 @@ static inline unsigned long __must_check copy_from_user(void *to,
    unsigned long n)
    {
    int sz = __compiletime_object_size(to);
    - int ret = -EFAULT;

    if (likely(sz == -1 || sz >= n))
    - ret = _copy_from_user(to, from, n);
    + n = _copy_from_user(to, from, n);
    else
    copy_from_user_overflow();

    - return ret;
    + return n;
    }

    long __must_check strncpy_from_user(char *dst, const char __user *src,
    diff --git a/arch/x86/include/asm/uaccess_64.h b/arch/x86/include/asm/uaccess_64.h
    index 46324c6..535e421 100644
    --- a/arch/x86/include/asm/uaccess_64.h
    +++ b/arch/x86/include/asm/uaccess_64.h
    @@ -30,16 +30,15 @@ static inline unsigned long __must_check copy_from_user(void *to,
    unsigned long n)
    {
    int sz = __compiletime_object_size(to);
    - int ret = -EFAULT;

    might_fault();
    if (likely(sz == -1 || sz >= n))
    - ret = _copy_from_user(to, from, n);
    + n = _copy_from_user(to, from, n);
    #ifdef CONFIG_DEBUG_VM
    else
    WARN(1, "Buffer overflow detected!\n");
    #endif
    - return ret;
    + return n;
    }

    static __always_inline __must_check

    \
     
     \ /
      Last update: 2010-01-05 23:19    [W:0.025 / U:34.004 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site