diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-06-29 09:03:38 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-06-29 09:03:38 -0400 |
commit | d5ba5b141dae17155d12b897f2eedeaf6800db7c (patch) | |
tree | 6b5395d91b852562cebedfeebc4726b45cd70e7f /drivers/acpi/device_pm.c | |
parent | 996e2569dab534089b095da86e5d01d9d954279e (diff) | |
parent | 9b5c7a5a977a330ffaf83c4d383ba247c74c800f (diff) |
Merge branch 'acpi-pm'
* acpi-pm:
ACPI / PM: Fix possible NULL pointer deref in acpi_pm_device_sleep_state()
Diffstat (limited to 'drivers/acpi/device_pm.c')
-rw-r--r-- | drivers/acpi/device_pm.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index 67624d4d5aef..e9e8bb24785b 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c | |||
@@ -541,7 +541,7 @@ int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in) | |||
541 | { | 541 | { |
542 | acpi_handle handle = DEVICE_ACPI_HANDLE(dev); | 542 | acpi_handle handle = DEVICE_ACPI_HANDLE(dev); |
543 | struct acpi_device *adev; | 543 | struct acpi_device *adev; |
544 | int ret, d_max; | 544 | int ret, d_min, d_max; |
545 | 545 | ||
546 | if (d_max_in < ACPI_STATE_D0 || d_max_in > ACPI_STATE_D3_COLD) | 546 | if (d_max_in < ACPI_STATE_D0 || d_max_in > ACPI_STATE_D3_COLD) |
547 | return -EINVAL; | 547 | return -EINVAL; |
@@ -560,19 +560,23 @@ int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in) | |||
560 | } | 560 | } |
561 | 561 | ||
562 | ret = acpi_dev_pm_get_state(dev, adev, acpi_target_system_state(), | 562 | ret = acpi_dev_pm_get_state(dev, adev, acpi_target_system_state(), |
563 | d_min_p, &d_max); | 563 | &d_min, &d_max); |
564 | if (ret) | 564 | if (ret) |
565 | return ret; | 565 | return ret; |
566 | 566 | ||
567 | if (d_max_in < *d_min_p) | 567 | if (d_max_in < d_min) |
568 | return -EINVAL; | 568 | return -EINVAL; |
569 | 569 | ||
570 | if (d_max > d_max_in) { | 570 | if (d_max > d_max_in) { |
571 | for (d_max = d_max_in; d_max > *d_min_p; d_max--) { | 571 | for (d_max = d_max_in; d_max > d_min; d_max--) { |
572 | if (adev->power.states[d_max].flags.valid) | 572 | if (adev->power.states[d_max].flags.valid) |
573 | break; | 573 | break; |
574 | } | 574 | } |
575 | } | 575 | } |
576 | |||
577 | if (d_min_p) | ||
578 | *d_min_p = d_min; | ||
579 | |||
576 | return d_max; | 580 | return d_max; |
577 | } | 581 | } |
578 | EXPORT_SYMBOL(acpi_pm_device_sleep_state); | 582 | EXPORT_SYMBOL(acpi_pm_device_sleep_state); |