acpi/apei: free lists of resources in einj and erst
Subsystems (3)
PATCH 1/1 acpi/apei: free lists of resources in einj and erst
This patch adds missing apei_resources_fini and
plugs several tiny memory leaks.
Signed-off-by Konstantin Khlebnikov <[email protected]>
--- drivers/acpi/apei/apei-base.c | 2 ++ drivers/acpi/apei/einj.c | 7 +++---- drivers/acpi/apei/erst.c | 1 + 3 files changed, 6 insertions(+), 4 deletions(-)
drivers/acpi/apei/apei-base.c +2 -0
@@ -497,6 +497,7 @@ int apei_resources_request(struct apei_resources *resources, rc =apei_resources_sub (resources, &nvs_resources);if (rc) goto nvs_res_fini; +apei_resources_fini (&nvs_resources);if (arch_apei_filter_addr) {apei_resources_init (&arch_res);
@@ -506,6 +507,7 @@ int apei_resources_request(struct apei_resources *resources, rc =apei_resources_sub (resources, &arch_res);if (rc) goto arch_res_fini; +apei_resources_fini (&arch_res); } rc = -EINVAL ;
drivers/acpi/apei/einj.c +3 -4
@@ -379,10 +379,9 @@ static int __einj_error_trigger(u64 trigger_paddr, u32 type, rc =apei_resources_add (&addr_resources, trigger_param_region->address, trigger_param_region->bit_width/8 , true); -if (rc) - goto out_fini; - rc =apei_resources_sub (&trigger_resources, - &addr_resources); +if (!rc) + rc =apei_resources_sub (&trigger_resources, + &addr_resources); }apei_resources_fini (&addr_resources);if (rc)
drivers/acpi/apei/erst.c +1 -0
@@ -1190,6 +1190,7 @@ static int __init erst_init(void)if (!erst_erange.vaddr) goto err_release_erange; +apei_resources_fini (&erst_resources);pr_info ("Error Record Serialization Table (ERST) support is initialized.\n" );
Luck, Tony
reviewerdrivers/acpi/apei/einj.c +3 -4
@@ -379,10 +379,9 @@ static int __einj_error_trigger(u64 trigger_paddr, u32 type, rc =apei_resources_add (&addr_resources, trigger_param_region->address, trigger_param_region->bit_width/8 , true); -if (rc) - goto out_fini; - rc =apei_resources_sub (&trigger_resources, - &addr_resources); +if (!rc) + rc =apei_resources_sub (&trigger_resources, + &addr_resources); }apei_resources_fini (&addr_resources);if (rc)
This bit looks wrong ... the line right after the this diff ends is
goto out_fini;
so we'll call apei_resources_fini() twice in the rc!=0 case.
-Tony
Quoted 17 lines · Tony
drivers/acpi/apei/einj.c +3
-4@@ -379,10 +379,9 @@ static int __einj_error_trigger(u64 trigger_paddr, u32 type, rc =apei_resources_add (&addr_resources, trigger_param_region->address, trigger_param_region->bit_width/8 , true); -if (rc) - goto out_fini; - rc =apei_resources_sub (&trigger_resources, - &addr_resources); +if (!rc) + rc =apei_resources_sub (&trigger_resources, + &addr_resources); }apei_resources_fini (&addr_resources);if (rc)
Quoted 4 lines
This bit looks wrong ... the line right after the this diff ends is
goto out_fini;so we'll call
apei_resources_fini()twice in the rc!=0 case.
As I see it frees different struct apei_resources: here addr_resources and trigger_resources at the out_fini.
Anyway calling apei_resources_fini twice is safe: it removes and frees ranges from lists. If these lists are empty apei_resources_fini does nothing.
Quoted 2 lines
-Tony