]> err.no Git - linux-2.6/commitdiff
ACPICA: Fixed a memory leak when Device or Thermal objects referenced in packages
authorBob Moore <robert.moore@intel.com>
Thu, 10 Apr 2008 15:06:39 +0000 (19:06 +0400)
committerLen Brown <len.brown@intel.com>
Tue, 22 Apr 2008 18:29:26 +0000 (14:29 -0400)
Problem introduced in fix for Package references.

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/dispatcher/dsobject.c
drivers/acpi/utilities/utdelete.c

index fe28b9aeb65cc28d23159ac998f1534795040580..7556d919bf8bbf08613c8ff08bfa79fb9fec594e 100644 (file)
@@ -172,7 +172,19 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
                        switch (op->common.node->type) {
                                /*
                                 * 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_METHOD:
@@ -180,25 +192,15 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
                        case ACPI_TYPE_PROCESSOR:
                        case ACPI_TYPE_EVENT:
                        case ACPI_TYPE_REGION:
-                       case ACPI_TYPE_DEVICE:
-                       case ACPI_TYPE_THERMAL:
 
-                               obj_desc =
-                                   (union acpi_operand_object *)op->common.
-                                   node;
+                               /* We will create a reference object for these types below */
                                break;
 
                        default:
-                               break;
-                       }
-
-                       /*
-                        * 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) {
+                               /*
+                                * All other types - the node was resolved to an actual
+                                * object, we are done.
+                                */
                                goto exit;
                        }
                }
@@ -223,7 +225,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
 
       exit:
        *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 */
 
                                obj_desc->reference.node = op->common.node;
+                               obj_desc->reference.object =
+                                   op->common.node->object;
                        }
 
                        obj_desc->reference.opcode = opcode;
index dcb34f805714fd07267bb599695b9bcdb175e6fa..6a763cd85f8c12874daed1a9e4cd62b88b93e0c1 100644 (file)
@@ -524,10 +524,12 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
 
                case ACPI_TYPE_LOCAL_REFERENCE:
                        /*
-                        * The target of an Index (a package, string, or buffer) must track
-                        * changes to the ref count of the index.
+                        * The target of an Index (a package, string, or buffer) or a named
+                        * 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;
                        }
                        break;