• Shaun Ruffell's avatar
    edac_mc: edac_mc_free() cannot assume mem_ctl_info is registered in sysfs. · faa2ad09
    Shaun Ruffell authored
    Fix potential NULL pointer dereference in edac_unregister_sysfs() on
    system boot introduced in 3.6-rc1.
    
    Since commit 7a623c03 ("edac: rewrite the sysfs code to use struct
    device") edac_mc_alloc() no longer initializes embedded kobjects in
    struct mem_ctl_info.  Therefore edac_mc_free() can no longer simply
    decrement a kobject reference count to free the allocated memory unless
    the memory controller driver module had also called edac_mc_add_mc().
    
    Now edac_mc_free() will check if the newly embedded struct device has
    been registered with sysfs before using either the standard device
    release functions or freeing the data structures itself with logic
    pulled out of the error path of edac_mc_alloc().
    
    The BUG this patch resolves for me:
    
      BUG: unable to handle kernel NULL pointer dereference at   (null)
      EIP is at __wake_up_common+0x1a/0x6a
      Process modprobe (pid: 933, ti=f3dc6000 task=f3db9520 task.ti=f3dc6000)
      Call Trace:
        complete_all+0x3f/0x50
        device_pm_remove+0x23/0xa2
        device_del+0x34/0x142
        edac_unregister_sysfs+0x3b/0x5c [edac_core]
        edac_mc_free+0x29/0x2f [edac_core]
        e7xxx_probe1+0x268/0x311 [e7xxx_edac]
        e7xxx_init_one+0x56/0x61 [e7xxx_edac]
        local_pci_probe+0x13/0x15
      ...
    
    Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
    Cc: Shaohui Xie <Shaohui.Xie@freescale.com>
    Signed-off-by: default avatarShaun Ruffell <sruffell@digium.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    faa2ad09
edac_mc.c 32.2 KB