Skip to content

Commit e7b2005

Browse files
acpibobrafaeljw
authored andcommitted
ACPICA: Fix a couple memory leaks during package object resolution
ACPICA commit 69d4415360446b4a1826dab76ba0cd6d24710ddd A couple memory leaks during resolution of individual package elements. Link: acpica/acpica@69d44153 Signed-off-by: Bob Moore <[email protected]> Signed-off-by: Erik Schmauss <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent bc4d413 commit e7b2005

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

drivers/acpi/acpica/dspkginit.c

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -297,8 +297,10 @@ acpi_ds_init_package_element(u8 object_type,
297297
{
298298
union acpi_operand_object **element_ptr;
299299

300+
ACPI_FUNCTION_TRACE(ds_init_package_element);
301+
300302
if (!source_object) {
301-
return (AE_OK);
303+
return_ACPI_STATUS(AE_OK);
302304
}
303305

304306
/*
@@ -329,7 +331,7 @@ acpi_ds_init_package_element(u8 object_type,
329331
source_object->package.flags |= AOPOBJ_DATA_VALID;
330332
}
331333

332-
return (AE_OK);
334+
return_ACPI_STATUS(AE_OK);
333335
}
334336

335337
/*******************************************************************************
@@ -352,6 +354,7 @@ acpi_ds_resolve_package_element(union acpi_operand_object **element_ptr)
352354
union acpi_generic_state scope_info;
353355
union acpi_operand_object *element = *element_ptr;
354356
struct acpi_namespace_node *resolved_node;
357+
struct acpi_namespace_node *original_node;
355358
char *external_path = NULL;
356359
acpi_object_type type;
357360

@@ -441,6 +444,7 @@ acpi_ds_resolve_package_element(union acpi_operand_object **element_ptr)
441444
* will remain as named references. This behavior is not described
442445
* in the ACPI spec, but it appears to be an oversight.
443446
*/
447+
original_node = resolved_node;
444448
status = acpi_ex_resolve_node_to_value(&resolved_node, NULL);
445449
if (ACPI_FAILURE(status)) {
446450
return_VOID;
@@ -468,26 +472,27 @@ acpi_ds_resolve_package_element(union acpi_operand_object **element_ptr)
468472
*/
469473
case ACPI_TYPE_DEVICE:
470474
case ACPI_TYPE_THERMAL:
471-
472-
/* TBD: This may not be necesssary */
473-
474-
acpi_ut_add_reference(resolved_node->object);
475+
case ACPI_TYPE_METHOD:
475476
break;
476477

477478
case ACPI_TYPE_MUTEX:
478-
case ACPI_TYPE_METHOD:
479479
case ACPI_TYPE_POWER:
480480
case ACPI_TYPE_PROCESSOR:
481481
case ACPI_TYPE_EVENT:
482482
case ACPI_TYPE_REGION:
483483

484+
/* acpi_ex_resolve_node_to_value gave these an extra reference */
485+
486+
acpi_ut_remove_reference(original_node->object);
484487
break;
485488

486489
default:
487490
/*
488491
* For all other types - the node was resolved to an actual
489-
* operand object with a value, return the object
492+
* operand object with a value, return the object. Remove
493+
* a reference on the existing object.
490494
*/
495+
acpi_ut_remove_reference(element);
491496
*element_ptr = (union acpi_operand_object *)resolved_node;
492497
break;
493498
}

0 commit comments

Comments
 (0)