| From cf082a6d1cb99c1cbcace0f529acecbeac9504b2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 4 Jun 2021 14:25:57 -0700 |
| Subject: ACPICA: Fix memory leak caused by _CID repair function |
| |
| From: Erik Kaneda <erik.kaneda@intel.com> |
| |
| [ Upstream commit c27bac0314131b11bccd735f7e8415ac6444b667 ] |
| |
| ACPICA commit 180cb53963aa876c782a6f52cc155d951b26051a |
| |
| According to the ACPI spec, _CID returns a package containing |
| hardware ID's. Each element of an ASL package contains a reference |
| count from the parent package as well as the element itself. |
| |
| Name (TEST, Package() { |
| "String object" // this package element has a reference count of 2 |
| }) |
| |
| A memory leak was caused in the _CID repair function because it did |
| not decrement the reference count created by the package. Fix the |
| memory leak by calling acpi_ut_remove_reference on _CID package elements |
| that represent a hardware ID (_HID). |
| |
| Link: https://github.com/acpica/acpica/commit/180cb539 |
| Tested-by: Shawn Guo <shawn.guo@linaro.org> |
| Signed-off-by: Erik Kaneda <erik.kaneda@intel.com> |
| Signed-off-by: Bob Moore <robert.moore@intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/acpi/acpica/nsrepair2.c | 7 +++++++ |
| 1 file changed, 7 insertions(+) |
| |
| diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c |
| index 125143c41bb8..8768594c79e5 100644 |
| --- a/drivers/acpi/acpica/nsrepair2.c |
| +++ b/drivers/acpi/acpica/nsrepair2.c |
| @@ -375,6 +375,13 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info, |
| |
| (*element_ptr)->common.reference_count = |
| original_ref_count; |
| + |
| + /* |
| + * The original_element holds a reference from the package object |
| + * that represents _HID. Since a new element was created by _HID, |
| + * remove the reference from the _CID package. |
| + */ |
| + acpi_ut_remove_reference(original_element); |
| } |
| |
| element_ptr++; |
| -- |
| 2.30.2 |
| |