• Linus Torvalds's avatar
    mm: move 'mmap_min_addr' logic from callers into vm_unmapped_area() · 6b008640
    Linus Torvalds authored
    Instead of having callers care about the mmap_min_addr logic for the
    lowest valid mapping address (and some of them getting it wrong), just
    move the logic into vm_unmapped_area() itself.  One less thing for various
    architecture cases (and generic helpers) to worry about.
    
    We should really try to make much more of this be common code, but baby
    steps..
    
    Without this, vm_unmapped_area() could return an address below
    mmap_min_addr (because some caller forgot about that).  That then causes
    the mmap machinery to think it has found a workable address, but then
    later security_mmap_addr(addr) is unhappy about it and the mmap() returns
    with a nonsensical error (EPERM).
    
    The proper action is to either return ENOMEM (if the virtual address space
    is exhausted), or try to find another address (ie do a bottom-up search
    for free addresses after the top-down one failed).
    
    See commit 2afc745f ("mm: ensure get_unmapped_area() returns higher
    address than mmap_min_addr"), which fixed this for one call site (the
    generic arch_get_unmapped_area_topdown() fallback) but left other cases
    alone.
    
    Link: https://lkml.kernel.org/r/20230418214009.1142926-1-Liam.Howlett@oracle.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarLiam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: Liam Howlett <liam.howlett@oracle.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    6b008640
mmap.c 101 KB