diff options
author | Axel Lin <axel.lin@gmail.com> | 2011-11-14 17:31:29 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2011-11-14 17:31:29 -0500 |
commit | 9f3bdd4f937a75c4589a867dc1f8fefe09c1a618 (patch) | |
tree | 577e4177cb14c73220875eecebeea6dc3676d4b6 /drivers/devfreq | |
parent | bc9f54498eadc5254378e376e8d2111cfd30b229 (diff) |
PM / devfreq: fix use after free in devfreq_remove_device
In devfreq_remove_device, calling _remove_devfreq will also free devfreq.
Don't dereference devfreq->governor->no_central_polling after _remove_devfreq.
Signed-off-by: Axel Lin <axel.lin@gmail.com>
Acked-by: MyungJoo Ham <myungjoo.ham@samsung.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Diffstat (limited to 'drivers/devfreq')
-rw-r--r-- | drivers/devfreq/devfreq.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index d0659253387a..59d24e9cb8c5 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c | |||
@@ -418,10 +418,14 @@ out: | |||
418 | */ | 418 | */ |
419 | int devfreq_remove_device(struct devfreq *devfreq) | 419 | int devfreq_remove_device(struct devfreq *devfreq) |
420 | { | 420 | { |
421 | bool central_polling; | ||
422 | |||
421 | if (!devfreq) | 423 | if (!devfreq) |
422 | return -EINVAL; | 424 | return -EINVAL; |
423 | 425 | ||
424 | if (!devfreq->governor->no_central_polling) { | 426 | central_polling = !devfreq->governor->no_central_polling; |
427 | |||
428 | if (central_polling) { | ||
425 | mutex_lock(&devfreq_list_lock); | 429 | mutex_lock(&devfreq_list_lock); |
426 | while (wait_remove_device == devfreq) { | 430 | while (wait_remove_device == devfreq) { |
427 | mutex_unlock(&devfreq_list_lock); | 431 | mutex_unlock(&devfreq_list_lock); |
@@ -433,7 +437,7 @@ int devfreq_remove_device(struct devfreq *devfreq) | |||
433 | mutex_lock(&devfreq->lock); | 437 | mutex_lock(&devfreq->lock); |
434 | _remove_devfreq(devfreq, false); /* it unlocks devfreq->lock */ | 438 | _remove_devfreq(devfreq, false); /* it unlocks devfreq->lock */ |
435 | 439 | ||
436 | if (!devfreq->governor->no_central_polling) | 440 | if (central_polling) |
437 | mutex_unlock(&devfreq_list_lock); | 441 | mutex_unlock(&devfreq_list_lock); |
438 | 442 | ||
439 | return 0; | 443 | return 0; |