aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/powerdomain.c
diff options
context:
space:
mode:
authorPaul Walmsley <paul@pwsan.com>2009-09-03 13:13:53 -0400
committerpaul <paul@twilight.(none)>2009-09-03 13:13:53 -0400
commit5d113262ee9e074e0d36362d878892819bfdeb47 (patch)
treed9cf88995c4a672ace8725518d4f1984350a9e26 /arch/arm/mach-omap2/powerdomain.c
parent36d568ec055cb3ac4507d38ebabba955cdbb443e (diff)
OMAP: powerdomain: Fix overflow when doing powerdomain deps lookups.
At the end of the list pd is a pointer to a NULL struct, so checking if the address == NULL doesn't help here. In fact the original code will just keep running past the struct to read who knows what in memory. This case manifests itself when from clkdms_setup() when enabling auto idle for a clock domain and the clockdomain usecount is greater than 0. When _clkdm_add_autodeps() tries to add the a dependency that does not exist in the powerdomain->wkdep_srcs array the for loop will run past the wkdep_srcs array. Currently in linux-omap you won't hit this because the not found case is never executed, unless you start modifying powerdomains and their wakeup/sleep deps. Signed-off-by: Mike Chan <mike@android.com> Signed-off-by: Paul Walmsley <paul@pwsan.com>
Diffstat (limited to 'arch/arm/mach-omap2/powerdomain.c')
-rw-r--r--arch/arm/mach-omap2/powerdomain.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c
index 983f1cb676be..66206b6357fc 100644
--- a/arch/arm/mach-omap2/powerdomain.c
+++ b/arch/arm/mach-omap2/powerdomain.c
@@ -83,7 +83,7 @@ static struct powerdomain *_pwrdm_deps_lookup(struct powerdomain *pwrdm,
83 if (!pwrdm || !deps || !omap_chip_is(pwrdm->omap_chip)) 83 if (!pwrdm || !deps || !omap_chip_is(pwrdm->omap_chip))
84 return ERR_PTR(-EINVAL); 84 return ERR_PTR(-EINVAL);
85 85
86 for (pd = deps; pd; pd++) { 86 for (pd = deps; pd->pwrdm_name; pd++) {
87 87
88 if (!omap_chip_is(pd->omap_chip)) 88 if (!omap_chip_is(pd->omap_chip))
89 continue; 89 continue;
@@ -96,7 +96,7 @@ static struct powerdomain *_pwrdm_deps_lookup(struct powerdomain *pwrdm,
96 96
97 } 97 }
98 98
99 if (!pd) 99 if (!pd->pwrdm_name)
100 return ERR_PTR(-ENOENT); 100 return ERR_PTR(-ENOENT);
101 101
102 return pd->pwrdm; 102 return pd->pwrdm;