• Jann Horn's avatar
    mm: fix (harmless) type confusion in lock_vma_under_rcu() · 17fe833b
    Jann Horn authored
    There is a (harmless) type confusion in lock_vma_under_rcu(): After
    vma_start_read(), we have taken the VMA lock but don't know yet whether
    the VMA has already been detached and scheduled for RCU freeing.  At this
    point, ->vm_start and ->vm_end are accessed.
    
    vm_area_struct contains a union such that ->vm_rcu uses the same memory as
    ->vm_start and ->vm_end; so accessing ->vm_start and ->vm_end of a
    detached VMA is illegal and leads to type confusion between union members.
    
    Fix it by reordering the vma->detached check above the address checks, and
    document the rules for RCU readers accessing VMAs.
    
    This will probably change the number of observed VMA_LOCK_MISS events
    (since previously, trying to access a detached VMA whose ->vm_rcu has been
    scheduled would bail out when checking the fault address against the
    rcu_head members reinterpreted as VMA bounds).
    
    Link: https://lkml.kernel.org/r/20240805-fix-vma-lock-type-confusion-v1-1-9f25443a9a71@google.com
    Fixes: 50ee3253 ("mm: introduce lock_vma_under_rcu to be used from arch-specific code")
    Signed-off-by: default avatarJann Horn <jannh@google.com>
    Acked-by: default avatarSuren Baghdasaryan <surenb@google.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    17fe833b
memory.c 182 KB