Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9e41d93c authored by Bob Moore's avatar Bob Moore Committed by Len Brown
Browse files

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



Problem introduced in fix for Package references.

Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarAlexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 7f4ac9f9
Loading
Loading
Loading
Loading
+21 −17
Original line number Original line Diff line number Diff line
@@ -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,
			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;
			}

				/*
				/*
			 * If above resolved to an operand object, we are done. Otherwise,
				 * All other types - the node was resolved to an actual
			 * we have a NS node, we must create the package entry as a named
				 * object, we are done.
			 * 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,


      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,
				/* 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;
+5 −3
Original line number Original line Diff line number Diff line
@@ -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;