aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpuidle/cpuidle.c
diff options
context:
space:
mode:
authorSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>2012-05-04 17:06:02 -0400
committerLen Brown <len.brown@intel.com>2012-06-01 16:07:23 -0400
commit1b0a0e9a15b976d91f3b5ae619c6a8964c2818eb (patch)
tree4408c6a983c18ca7c8cc1a9d55008b3dd5d33703 /drivers/cpuidle/cpuidle.c
parent0aeb9cac6f8a6fc68acfb07d30b62ad6106a6384 (diff)
cpuidle: add checks to avoid NULL pointer dereference
The existing check for dev == NULL in __cpuidle_register_device() is rendered useless because dev is dereferenced before the check itself. Moreover, correctly speaking, it is the job of the callers of this function, i.e., cpuidle_register_device() & cpuidle_enable_device() (which also happen to be exported functions) to ensure that __cpuidle_register_device() is called with a non-NULL dev. So add the necessary dev == NULL checks in the two callers and remove the (useless) check from __cpuidle_register_device(). Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/cpuidle/cpuidle.c')
-rw-r--r--drivers/cpuidle/cpuidle.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index 588b44aa1de4..8ffef26ffdcf 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -285,6 +285,9 @@ int cpuidle_enable_device(struct cpuidle_device *dev)
285 int ret, i; 285 int ret, i;
286 struct cpuidle_driver *drv = cpuidle_get_driver(); 286 struct cpuidle_driver *drv = cpuidle_get_driver();
287 287
288 if (!dev)
289 return -EINVAL;
290
288 if (dev->enabled) 291 if (dev->enabled)
289 return 0; 292 return 0;
290 if (!drv || !cpuidle_curr_governor) 293 if (!drv || !cpuidle_curr_governor)
@@ -369,8 +372,6 @@ static int __cpuidle_register_device(struct cpuidle_device *dev)
369 struct device *cpu_dev = get_cpu_device((unsigned long)dev->cpu); 372 struct device *cpu_dev = get_cpu_device((unsigned long)dev->cpu);
370 struct cpuidle_driver *cpuidle_driver = cpuidle_get_driver(); 373 struct cpuidle_driver *cpuidle_driver = cpuidle_get_driver();
371 374
372 if (!dev)
373 return -EINVAL;
374 if (!try_module_get(cpuidle_driver->owner)) 375 if (!try_module_get(cpuidle_driver->owner))
375 return -EINVAL; 376 return -EINVAL;
376 377
@@ -395,6 +396,9 @@ int cpuidle_register_device(struct cpuidle_device *dev)
395{ 396{
396 int ret; 397 int ret;
397 398
399 if (!dev)
400 return -EINVAL;
401
398 mutex_lock(&cpuidle_lock); 402 mutex_lock(&cpuidle_lock);
399 403
400 if ((ret = __cpuidle_register_device(dev))) { 404 if ((ret = __cpuidle_register_device(dev))) {