diff options
author | Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> | 2012-05-04 17:06:02 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2012-06-01 16:07:23 -0400 |
commit | 1b0a0e9a15b976d91f3b5ae619c6a8964c2818eb (patch) | |
tree | 4408c6a983c18ca7c8cc1a9d55008b3dd5d33703 /drivers/cpuidle/cpuidle.c | |
parent | 0aeb9cac6f8a6fc68acfb07d30b62ad6106a6384 (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.c | 8 |
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))) { |