• Li Xinhai's avatar
    mm: don't prepare anon_vma if vma has VM_WIPEONFORK · 93949bb2
    Li Xinhai authored
    Patch series "mm: Fix misuse of parent anon_vma in dup_mmap path".
    
    This patchset fixes the misuse of parenet anon_vma, which mainly caused by
    child vma's vm_next and vm_prev are left same as its parent after
    duplicate vma.  Finally, code reached parent vma's neighbor by referring
    pointer of child vma and executed wrong logic.
    
    The first two patches fix relevant issues, and the third patch sets
    vm_next and vm_prev to NULL when duplicate vma to prevent potential misuse
    in future.
    
    Effects of the first bug is that causes rmap code to check both parent and
    child's page table, although a page couldn't be mapped by both parent and
    child, because child vma has WIPEONFORK so all pages mapped by child are
    'new' and not relevant to parent.
    
    Effects of the second bug is that the relationship of anon_vma of parent
    and child are totallyconvoluted.  It would cause 'son', 'grandson', ...,
    etc, to share 'parent' anon_vma, which disobey the design rule of reusing
    anon_vma (the rule to be followed is that reusing should among vma of same
    process, and vma should not gone through fork).
    
    So, both issues should cause unnecessary rmap walking and have unexpected
    complexity.
    
    These two issues would not be directly visible, I used debugging code to
    check the anon_vma pointers of parent and child when inspecting the
    suspicious implementation of issue #2, then find the problem.
    
    This patch (of 3):
    
    In dup_mmap(), anon_vma_prepare() is called for vma has VM_WIPEONFORK, and
    parameter 'tmp' (i.e., the new vma of child) has same ->vm_next and
    ->vm_prev as its parent vma.  That allows anon_vma used by parent been
    mistakenly shared by child (find_mergeable_anon_vma() will do this reuse
    work).
    
    Besides this issue, call anon_vma_prepare() should be avoided because we
    don't copy page for this vma.  Preparing anon_vma will be handled during
    fault.
    
    Fixes: d2cd9ede ("mm,fork: introduce MADV_WIPEONFORK")
    Signed-off-by: default avatarLi Xinhai <lixinhai.lxh@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Acked-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Link: http://lkml.kernel.org/r/1581150928-3214-2-git-send-email-lixinhai.lxh@gmail.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    93949bb2
fork.c 73.8 KB