• Lorenzo Stoakes's avatar
    mm/mempolicy: correctly update prev when policy is equal on mbind · 00ca0f2e
    Lorenzo Stoakes authored
    The refactoring in commit f4e9e0e6 ("mm/mempolicy: fix use-after-free
    of VMA iterator") introduces a subtle bug which arises when attempting to
    apply a new NUMA policy across a range of VMAs in mbind_range().
    
    The refactoring passes a **prev pointer to keep track of the previous VMA
    in order to reduce duplication, and in all but one case it keeps this
    correctly updated.
    
    The bug arises when a VMA within the specified range has an equivalent
    policy as determined by mpol_equal() - which unlike other cases, does not
    update prev.
    
    This can result in a situation where, later in the iteration, a VMA is
    found whose policy does need to change.  At this point, vma_merge() is
    invoked with prev pointing to a VMA which is before the previous VMA.
    
    Since vma_merge() discovers the curr VMA by looking for the one
    immediately after prev, it will now be in a situation where this VMA is
    incorrect and the merge will not proceed correctly.
    
    This is checked in the VM_WARN_ON() invariant case with end >
    curr->vm_end, which, if a merge is possible, results in a warning (if
    CONFIG_DEBUG_VM is specified).
    
    I note that vma_merge() performs these invariant checks only after
    merge_prev/merge_next are checked, which is debatable as it hides this
    issue if no merge is possible even though a buggy situation has arisen.
    
    The solution is simply to update the prev pointer even when policies are
    equal.
    
    This caused a bug to arise in the 6.2.y stable tree, and this patch
    resolves this bug.
    
    Link: https://lkml.kernel.org/r/83f1d612acb519d777bebf7f3359317c4e7f4265.1682866629.git.lstoakes@gmail.com
    Fixes: f4e9e0e6 ("mm/mempolicy: fix use-after-free of VMA iterator")
    Signed-off-by: default avatarLorenzo Stoakes <lstoakes@gmail.com>
    Reported-by: default avatarkernel test robot <oliver.sang@intel.com>
      Link: https://lore.kernel.org/oe-lkp/202304292203.44ddeff6-oliver.sang@intel.com
    Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    00ca0f2e
mempolicy.c 78.4 KB