Skip to content
  • Ethan Barnes's avatar
    smp/hotplug: Handle removal correctly in cpuhp_store_callbacks() · 0c96b273
    Ethan Barnes authored
    If cpuhp_store_callbacks() is called for CPUHP_AP_ONLINE_DYN or
    CPUHP_BP_PREPARE_DYN, which are the indicators for dynamically allocated
    states, then cpuhp_store_callbacks() allocates a new dynamic state. The
    first allocation in each range returns CPUHP_AP_ONLINE_DYN or
    CPUHP_BP_PREPARE_DYN.
    
    If cpuhp_remove_state() is invoked for one of these states, then there is
    no protection against the allocation mechanism. So the removal, which
    should clear the callbacks and the name, gets a new state assigned and
    clears that one.
    
    As a consequence the state which should be cleared stays initialized. A
    consecutive CPU hotplug operation dereferences the state callbacks and
    accesses either freed or reused memory, resulting in crashes.
    
    Add a protection against this by checking the name argument for NULL. If
    it's NULL it's a removal. If not, it's an allocation.
    
    [ tglx: Added a comment and massaged changelog ]
    
    Fixes: 5b7aa87e
    
     ("cpu/hotplug: Implement setup/removal interface")
    Signed-off-by: default avatarEthan Barnes <ethan.barnes@sandisk.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@kernel.or>
    Cc: "Srivatsa S. Bhat" <srivatsa@mit.edu>
    Cc: Sebastian Siewior <bigeasy@linutronix.d>
    Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/DM2PR04MB398242FC7776D603D9F99C894A60@DM2PR04MB398.namprd04.prod.outlook.com
    0c96b273