Commit 6eefb2a9 authored by Jonathan Cameron's avatar Jonathan Cameron Committed by Xiongfeng Wang
Browse files

ACPI: processor: Fix memory leaks in error paths of processor_add()

stable inclusion
from stable-v4.19.322
commit 00259ae5206a713234e3ac12a8a0f731e86b754b
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAYQRI
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=00259ae5206a713234e3ac12a8a0f731e86b754b



--------------------------------

[ Upstream commit 47ec9b417ed9b6b8ec2a941cd84d9de62adc358a ]

If acpi_processor_get_info() returned an error, pr and the associated
pr->throttling.shared_cpu_map were leaked.

The unwind code was in the wrong order wrt to setup, relying on
some unwind actions having no affect (clearing variables that were
never set etc).  That makes it harder to reason about so reorder
and add appropriate labels to only undo what was actually set up
in the first place.

Acked-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: default avatarGavin Shan <gshan@redhat.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/20240529133446.28446-6-Jonathan.Cameron@huawei.com


Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarXiongfeng Wang <wangxiongfeng2@huawei.com>
parent 7cc94eaa
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -391,7 +391,7 @@ static int acpi_processor_add(struct acpi_device *device,

	result = acpi_processor_get_info(device);
	if (result) /* Processor is not physically present or unavailable */
		return result;
		goto err_clear_driver_data;

	BUG_ON(pr->id >= nr_cpu_ids);

@@ -406,7 +406,7 @@ static int acpi_processor_add(struct acpi_device *device,
			"BIOS reported wrong ACPI id %d for the processor\n",
			pr->id);
		/* Give up, but do not abort the namespace scan. */
		goto err;
		goto err_clear_driver_data;
	}
	/*
	 * processor_device_array is not cleared on errors to allow buggy BIOS
@@ -418,12 +418,12 @@ static int acpi_processor_add(struct acpi_device *device,
	dev = get_cpu_device(pr->id);
	if (!dev) {
		result = -ENODEV;
		goto err;
		goto err_clear_per_cpu;
	}

	result = acpi_bind_one(dev, device);
	if (result)
		goto err;
		goto err_clear_per_cpu;

	pr->dev = dev;

@@ -434,10 +434,11 @@ static int acpi_processor_add(struct acpi_device *device,
	dev_err(dev, "Processor driver could not be attached\n");
	acpi_unbind_one(dev);

 err:
	free_cpumask_var(pr->throttling.shared_cpu_map);
	device->driver_data = NULL;
 err_clear_per_cpu:
	per_cpu(processors, pr->id) = NULL;
 err_clear_driver_data:
	device->driver_data = NULL;
	free_cpumask_var(pr->throttling.shared_cpu_map);
 err_free_pr:
	kfree(pr);
	return result;