]> git.baikalelectronics.ru Git - kernel.git/commit
component: remove device from master match list on failed add
authorDaniel Stone <daniels@collabora.com>
Mon, 8 Feb 2016 21:12:58 +0000 (21:12 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 11 Feb 2016 09:42:09 +0000 (09:42 +0000)
commit857479c11c1adee631c121bf51d2c1cb2eccd5fc
tree1eda919447d1599037fc2216ea27682f05953df4
parent5beccc8c8640c558a7bff34561a9e585d8b650d4
component: remove device from master match list on failed add

Calling component_add() may result in the completion of a set of
devices, which will try to bring up a master. In bringing the master
up, we populate its match array with the current set of children.

If binding any of the devices fails, component_add() itself will fail,
free the struct component entry, and return to the caller. The
now-freed entry is never removed from the master's match array, and
will later be used in a futile attempt to bind to freed memory.

Bring component_add's behaviour on failure to bring up a master into
line with component_del by removing the (to-be-freed) component from
the master's match array.

The specific case which broke was:
  - rockchip_drm_drv adds a component master
  - dwhdmi_rockchip adds a child component in probe (master incomplete)
  - rockchip_drm_vop adds two children in probe, which completes the
    set
  - inside component_add, we try to bring up the master, having
    populated the master's match array, and fail with EPROBE_DEFER from
    dwhdmi_rockchip; we delete the putative component
  - rockchip_drm_vop's probe fails and returns EPROBE_DEFER
  - we later re-probe rockchip_drm_vop and add the component; the
    master is complete, so we attempt to bring it up again
  - walking the match array, we find the previous child, whose master
    pointer doesn't match (as it has been freed in the meantime)
  - rockchip_drm_vop probe fails, and will never be attempted again

Fixes: 40c103b9466002e1b40acd5fc53840e2852b7ae9
Signed-off-by: Daniel Stone <daniels@collabora.com>
Cc: Russell King <rmk+kernel@arm.linux.org.uk>
Cc: Thierry Reding <treding@nvidia.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/base/component.c