Skip to content
  • Linus Torvalds's avatar
    x86, 64-bit: Clean up user address masking · 9063c61f
    Linus Torvalds authored
    The discussion about using "access_ok()" in get_user_pages_fast() (see
    commit 7f818906
    
    : "x86: don't use
    'access_ok()' as a range check in get_user_pages_fast()" for details and
    end result), made us notice that x86-64 was really being very sloppy
    about virtual address checking.
    
    So be way more careful and straightforward about masking x86-64 virtual
    addresses:
    
     - All the VIRTUAL_MASK* variants now cover half of the address
       space, it's not like we can use the full mask on a signed
       integer, and the larger mask just invites mistakes when
       applying it to either half of the 48-bit address space.
    
     - /proc/kcore's kc_offset_to_vaddr() becomes a lot more
       obvious when it transforms a file offset into a
       (kernel-half) virtual address.
    
     - Unify/simplify the 32-bit and 64-bit USER_DS definition to
       be based on TASK_SIZE_MAX.
    
    This cleanup and more careful/obvious user virtual address checking also
    uncovered a buglet in the x86-64 implementation of strnlen_user(): it
    would do an "access_ok()" check on the whole potential area, even if the
    string itself was much shorter, and thus return an error even for valid
    strings. Our sloppy checking had hidden this.
    
    So this fixes 'strnlen_user()' to do this properly, the same way we
    already handled user strings in 'strncpy_from_user()'.  Namely by just
    checking the first byte, and then relying on fault handling for the
    rest.  That always works, since we impose a guard page that cannot be
    mapped at the end of the user space address space (and even if we
    didn't, we'd have the address space hole).
    
    Acked-by: default avatarIngo Molnar <mingo@elte.hu>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Nick Piggin <npiggin@suse.de>
    Cc: Hugh Dickins <hugh.dickins@tiscali.co.uk>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    9063c61f