• Tang Chen's avatar
    arch/x86/mm/numa.c: fix array index overflow when synchronizing nid to memblock.reserved. · 7bc35fdd
    Tang Chen authored
    The following path will cause array out of bound.
    
    memblock_add_region() will always set nid in memblock.reserved to
    MAX_NUMNODES.  In numa_register_memblks(), after we set all nid to
    correct valus in memblock.reserved, we called setup_node_data(), and
    used memblock_alloc_nid() to allocate memory, with nid set to
    MAX_NUMNODES.
    
    The nodemask_t type can be seen as a bit array.  And the index is 0 ~
    MAX_NUMNODES-1.
    
    After that, when we call node_set() in numa_clear_kernel_node_hotplug(),
    the nodemask_t got an index of value MAX_NUMNODES, which is out of [0 ~
    MAX_NUMNODES-1].
    
    See below:
    
    numa_init()
     |---> numa_register_memblks()
     |      |---> memblock_set_node(memory)		set correct nid in memblock.memory
     |      |---> memblock_set_node(reserved)	set correct nid in memblock.reserved
     |      |......
     |      |---> setup_node_data()
     |             |---> memblock_alloc_nid()	here, nid is set to MAX_NUMNODES (1024)
     |......
     |---> numa_clear_kernel_node_hotplug()
            |---> node_set()			here, we have an index 1024, and overflowed
    
    This patch moves nid setting to numa_clear_kernel_node_hotplug() to fix
    this problem.
    Reported-by: default avatarDave Jones <davej@redhat.com>
    Signed-off-by: default avatarTang Chen <tangchen@cn.fujitsu.com>
    Tested-by: default avatarGu Zheng <guz.fnst@cn.fujitsu.com>
    Reported-by: default avatarDave Jones <davej@redhat.com>
    Cc: David Rientjes <rientjes@google.com>
    Tested-by: default avatarDave Jones <davej@redhat.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    7bc35fdd
numa.c 21.9 KB