提交 9e41d93c 编写于 作者: B Bob Moore 提交者: Len Brown

ACPICA: Fixed a memory leak when Device or Thermal objects referenced in packages

Problem introduced in fix for Package references.
Signed-off-by: NBob Moore <robert.moore@intel.com>
Signed-off-by: NAlexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: NLen Brown <len.brown@intel.com>
上级 7f4ac9f9
...@@ -172,7 +172,19 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, ...@@ -172,7 +172,19 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
switch (op->common.node->type) { switch (op->common.node->type) {
/* /*
* For these types, we need the actual node, not the subobject. * For these types, we need the actual node, not the subobject.
* However, the subobject got an extra reference count above. * However, the subobject did not get an extra reference count above.
*
* TBD: should ex_resolve_node_to_value be changed to fix this?
*/
case ACPI_TYPE_DEVICE:
case ACPI_TYPE_THERMAL:
acpi_ut_add_reference(op->common.node->object);
/*lint -fallthrough */
/*
* For these types, we need the actual node, not the subobject.
* The subobject got an extra reference count in ex_resolve_node_to_value.
*/ */
case ACPI_TYPE_MUTEX: case ACPI_TYPE_MUTEX:
case ACPI_TYPE_METHOD: case ACPI_TYPE_METHOD:
...@@ -180,25 +192,15 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, ...@@ -180,25 +192,15 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
case ACPI_TYPE_PROCESSOR: case ACPI_TYPE_PROCESSOR:
case ACPI_TYPE_EVENT: case ACPI_TYPE_EVENT:
case ACPI_TYPE_REGION: case ACPI_TYPE_REGION:
case ACPI_TYPE_DEVICE:
case ACPI_TYPE_THERMAL:
obj_desc = /* We will create a reference object for these types below */
(union acpi_operand_object *)op->common.
node;
break; break;
default: default:
break; /*
} * All other types - the node was resolved to an actual
* object, we are done.
/* */
* If above resolved to an operand object, we are done. Otherwise,
* we have a NS node, we must create the package entry as a named
* reference.
*/
if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) !=
ACPI_DESC_TYPE_NAMED) {
goto exit; goto exit;
} }
} }
...@@ -223,7 +225,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, ...@@ -223,7 +225,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
exit: exit:
*obj_desc_ptr = obj_desc; *obj_desc_ptr = obj_desc;
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(status);
} }
/******************************************************************************* /*******************************************************************************
...@@ -743,6 +745,8 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, ...@@ -743,6 +745,8 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
/* Node was saved in Op */ /* Node was saved in Op */
obj_desc->reference.node = op->common.node; obj_desc->reference.node = op->common.node;
obj_desc->reference.object =
op->common.node->object;
} }
obj_desc->reference.opcode = opcode; obj_desc->reference.opcode = opcode;
......
...@@ -524,10 +524,12 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action) ...@@ -524,10 +524,12 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
case ACPI_TYPE_LOCAL_REFERENCE: case ACPI_TYPE_LOCAL_REFERENCE:
/* /*
* The target of an Index (a package, string, or buffer) must track * The target of an Index (a package, string, or buffer) or a named
* changes to the ref count of the index. * reference must track changes to the ref count of the index or
* target object.
*/ */
if (object->reference.opcode == AML_INDEX_OP) { if ((object->reference.opcode == AML_INDEX_OP) ||
(object->reference.opcode == AML_INT_NAMEPATH_OP)) {
next_object = object->reference.object; next_object = object->reference.object;
} }
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册