aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/cppc_acpi.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-12-09 18:52:28 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-12-12 17:52:34 -0500
commit28076483afac9dd77df269f5d460e51a09dfb19f (patch)
treebcb0fb3011d1c9290cc9be643b6ccf2be9479c19 /drivers/acpi/cppc_acpi.c
parent9e9d68dad58c70f40f50adfeabd2fdaa39a743fd (diff)
ACPI / CPPC: Fix per-CPU pointer management in acpi_cppc_processor_probe()
Fix a possible use-after-free scenario in acpi_cppc_processor_probe() that can happen if the function returns without cleaning up the per-CPU pointer set by it previously. Reported-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/cppc_acpi.c')
-rw-r--r--drivers/acpi/cppc_acpi.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c
index ae2ad6e94132..3ca0729f7e0e 100644
--- a/drivers/acpi/cppc_acpi.c
+++ b/drivers/acpi/cppc_acpi.c
@@ -776,9 +776,6 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
776 init_waitqueue_head(&pcc_data.pcc_write_wait_q); 776 init_waitqueue_head(&pcc_data.pcc_write_wait_q);
777 } 777 }
778 778
779 /* Plug PSD data into this CPUs CPC descriptor. */
780 per_cpu(cpc_desc_ptr, pr->id) = cpc_ptr;
781
782 /* Everything looks okay */ 779 /* Everything looks okay */
783 pr_debug("Parsed CPC struct for CPU: %d\n", pr->id); 780 pr_debug("Parsed CPC struct for CPU: %d\n", pr->id);
784 781
@@ -789,10 +786,15 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
789 goto out_free; 786 goto out_free;
790 } 787 }
791 788
789 /* Plug PSD data into this CPUs CPC descriptor. */
790 per_cpu(cpc_desc_ptr, pr->id) = cpc_ptr;
791
792 ret = kobject_init_and_add(&cpc_ptr->kobj, &cppc_ktype, &cpu_dev->kobj, 792 ret = kobject_init_and_add(&cpc_ptr->kobj, &cppc_ktype, &cpu_dev->kobj,
793 "acpi_cppc"); 793 "acpi_cppc");
794 if (ret) 794 if (ret) {
795 per_cpu(cpc_desc_ptr, pr->id) = NULL;
795 goto out_free; 796 goto out_free;
797 }
796 798
797 kfree(output.pointer); 799 kfree(output.pointer);
798 return 0; 800 return 0;