aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/device_pm.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-06-29 09:03:38 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-06-29 09:03:38 -0400
commitd5ba5b141dae17155d12b897f2eedeaf6800db7c (patch)
tree6b5395d91b852562cebedfeebc4726b45cd70e7f /drivers/acpi/device_pm.c
parent996e2569dab534089b095da86e5d01d9d954279e (diff)
parent9b5c7a5a977a330ffaf83c4d383ba247c74c800f (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.c12
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}
578EXPORT_SYMBOL(acpi_pm_device_sleep_state); 582EXPORT_SYMBOL(acpi_pm_device_sleep_state);