Skip to content

Commit

Permalink
PM / domains: avoid potential oops in pm_genpd_remove_device()
Browse files Browse the repository at this point in the history
pm_genpd_remove_device() tries hard to validate the generic PM domain
passed to it, but the validation is not complete.

dev->pm_domain contains a struct dev_pm_domain, which is the "base
class" of generic PM domains.  Other users of dev_pm_domains include
stuff like vga_switheroo.  Hence, a device could have a generic PM
domain or a vga_switcheroo PM domain in dev->pm_domain.

We need ot be certain that the PM domain is actually valid before we
try to remove it.  We can do this easily as we have a way to get the
current validated generic PM domain for a struct device.  This must
match the generic PM domain being requested for removal.

Convert the code to use this alternative validation method instead.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Kevin Hilman <khilman@linaro.org>
Acked-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Russell King authored and Rafael J. Wysocki committed Mar 23, 2015
1 parent 446d999 commit df6a0d6
Showing 1 changed file with 1 addition and 3 deletions.
4 changes: 1 addition & 3 deletions drivers/base/power/domain.c
Original file line number Diff line number Diff line change
Expand Up @@ -1542,9 +1542,7 @@ int pm_genpd_remove_device(struct generic_pm_domain *genpd,

dev_dbg(dev, "%s()\n", __func__);

if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(dev)
|| IS_ERR_OR_NULL(dev->pm_domain)
|| pd_to_genpd(dev->pm_domain) != genpd)
if (!genpd || genpd != pm_genpd_lookup_dev(dev))
return -EINVAL;

/* The above validation also means we have existing domain_data. */
Expand Down

0 comments on commit df6a0d6

Please sign in to comment.