[PATCH] cpufreq: acpi-cpufreq: add NULL check for acpi_perf_data before freeing
lirongqing <[email protected]>
| Newsgroups | org.kernel.vger.linux-pm |
|---|---|
| Message-ID | <[email protected]> |
From: Li RongQing <[email protected]> If alloc_percpu() fails in acpi_cpufreq_early_init(), acpi_perf_data is NULL. Calling free_acpi_perf_data() will execute per_cpu_ptr(NULL, i), which does not return NULL but an offset pointer. Dereferencing ->shared_cpu_map on this invalid pointer leads to a kernel crash. Fix these issues by adding a NULL check at the start of free_acpi_perf_data() and setting acpi_perf_data to NULL after freeing. Signed-off-by: Li RongQing <[email protected]> --- drivers/cpufreq/acpi-cpufreq.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index 87e4923..cd2ca87 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c @@ -517,11 +517,14 @@ static void free_acpi_perf_data(void) { unsigned int i; - /* Freeing a NULL pointer is OK, and alloc_percpu zeroes. */ + if (!acpi_perf_data) + return; + for_each_possible_cpu(i) free_cpumask_var(per_cpu_ptr(acpi_perf_data, i) ->shared_cpu_map); free_percpu(acpi_perf_data); + acpi_perf_data = NULL; } static int cpufreq_boost_down_prep(unsigned int cpu) -- 2.9.4