• Andy Shevchenko's avatar
    mfd: Remove software node conditionally and locate at right place · 5a23e8b0
    Andy Shevchenko authored
    Currently the software node is removed in error case and at ->remove()
    stage unconditionally, that ruins the symmetry. Besides, in some cases,
    when mfd_add_device() fails, the device_remove_software_node() call
    may lead to NULL pointer dereference:
    
      BUG: kernel NULL pointer dereference, address: 00000000
      ...
      EIP: strlen+0x12/0x20
      ...
      kernfs_name_hash+0x13/0x70
      kernfs_find_ns+0x32/0xc0
      kernfs_remove_by_name_ns+0x2a/0x90
      sysfs_remove_link+0x16/0x30
      software_node_notify.cold+0x34/0x6b
      device_remove_software_node+0x5a/0x90
      mfd_add_device.cold+0x30a/0x427
    
    Fix all these by guarding device_remove_software_node() with a conditional
    and locating it at the right place.
    
    Fixes: 42e59982 ("mfd: core: Add support for software nodes")
    Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
    5a23e8b0
mfd-core.c 10.8 KB