summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorRobert Moore <Robert.Moore@intel.com>2017-12-13 08:35:47 -0800
committerRobert Moore <Robert.Moore@intel.com>2017-12-13 08:35:47 -0800
commit69d4415360446b4a1826dab76ba0cd6d24710ddd (patch)
treee187a3ce53bfe421e8dee244fc5db34da1373c27 /source
parentab9c83985e8b2b25dc1c173b753280a8d04922b5 (diff)
downloadacpica-69d4415360446b4a1826dab76ba0cd6d24710ddd.tar.gz
Fix a couple memory leaks during package object resolution
A couple memory leaks during resolution of individual package elements.
Diffstat (limited to 'source')
-rw-r--r--source/components/dispatcher/dspkginit.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/source/components/dispatcher/dspkginit.c b/source/components/dispatcher/dspkginit.c
index 14e34b092..d7a4c178a 100644
--- a/source/components/dispatcher/dspkginit.c
+++ b/source/components/dispatcher/dspkginit.c
@@ -419,9 +419,12 @@ AcpiDsInitPackageElement (
ACPI_OPERAND_OBJECT **ElementPtr;
+ ACPI_FUNCTION_TRACE (DsInitPackageElement);
+
+
if (!SourceObject)
{
- return (AE_OK);
+ return_ACPI_STATUS (AE_OK);
}
/*
@@ -456,7 +459,7 @@ AcpiDsInitPackageElement (
SourceObject->Package.Flags |= AOPOBJ_DATA_VALID;
}
- return (AE_OK);
+ return_ACPI_STATUS (AE_OK);
}
@@ -481,6 +484,7 @@ AcpiDsResolvePackageElement (
ACPI_GENERIC_STATE ScopeInfo;
ACPI_OPERAND_OBJECT *Element = *ElementPtr;
ACPI_NAMESPACE_NODE *ResolvedNode;
+ ACPI_NAMESPACE_NODE *OriginalNode;
char *ExternalPath = NULL;
ACPI_OBJECT_TYPE Type;
@@ -576,6 +580,7 @@ AcpiDsResolvePackageElement (
* will remain as named references. This behavior is not described
* in the ACPI spec, but it appears to be an oversight.
*/
+ OriginalNode = ResolvedNode;
Status = AcpiExResolveNodeToValue (&ResolvedNode, NULL);
if (ACPI_FAILURE (Status))
{
@@ -607,26 +612,27 @@ AcpiDsResolvePackageElement (
*/
case ACPI_TYPE_DEVICE:
case ACPI_TYPE_THERMAL:
-
- /* TBD: This may not be necesssary */
-
- AcpiUtAddReference (ResolvedNode->Object);
+ case ACPI_TYPE_METHOD:
break;
case ACPI_TYPE_MUTEX:
- case ACPI_TYPE_METHOD:
case ACPI_TYPE_POWER:
case ACPI_TYPE_PROCESSOR:
case ACPI_TYPE_EVENT:
case ACPI_TYPE_REGION:
+ /* AcpiExResolveNodeToValue gave these an extra reference */
+
+ AcpiUtRemoveReference (OriginalNode->Object);
break;
default:
/*
* For all other types - the node was resolved to an actual
- * operand object with a value, return the object
+ * operand object with a value, return the object. Remove
+ * a reference on the existing object.
*/
+ AcpiUtRemoveReference (Element);
*ElementPtr = (ACPI_OPERAND_OBJECT *) ResolvedNode;
break;
}