Skip to content
  • Andrea Arcangeli's avatar
    ksm: fix use after free with merge_across_nodes = 0 · b4fecc67
    Andrea Arcangeli authored
    If merge_across_nodes was manually set to 0 (not the default value) by
    the admin or a tuned profile on NUMA systems triggering cross-NODE page
    migrations, a stable_node use after free could materialize.
    
    If the chain is collapsed stable_node would point to the old chain that
    was already freed.  stable_node_dup would be the stable_node dup now
    converted to a regular stable_node and indexed in the rbtree in
    replacement of the freed stable_node chain (not anymore a dup).
    
    This special case where the chain is collapsed in the NUMA replacement
    path, is now detected by setting stable_node to NULL by the chain_prune
    callee if it decides to collapse the chain.  This tells the NUMA
    replacement code that even if stable_node and stable_node_dup are
    different, this is not a chain if stable_node is NULL, as the
    stable_node_dup was converted to a regular stable_node and the chain was
    collapsed.
    
    It is generally safer for the callee to force the caller stable_node to
    NULL the moment it become stale so any other mistake like this would
    result in an instant Oops easier to debug than an use after free.
    
    Otherwise the replace logic would act like if stable_node was a valid
    chain, when in fact it was freed.  Notably
    stable_node_chain_add_dup(page_node, stable_node) would run on a stable
    stable_node.
    
    Andrey Ryabinin found the source of the use after free in chain_prune().
    
    Link: http://lkml.kernel.org/r/20170512193805.8807-2-aarcange@redhat.com
    
    
    Signed-off-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
    Reported-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
    Reported-by: default avatarEvgheni Dereveanchin <ederevea@redhat.com>
    Tested-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
    Cc: Petr Holasek <pholasek@redhat.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: Arjan van de Ven <arjan@linux.intel.com>
    Cc: Gavin Guo <gavin.guo@canonical.com>
    Cc: Jay Vosburgh <jay.vosburgh@canonical.com>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    b4fecc67