mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
PM / domains: avoid potential oops in pm_genpd_remove_device()
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>
This commit is contained in:
parent
446d999c1c
commit
df6a0d6f63
1 changed files with 1 additions and 3 deletions
|
@ -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. */
|
||||
|
|
Loading…
Reference in a new issue