]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
ACPICA: Fix possible memory leak for Scope ASL operator
authorLin Ming <ming.m.lin@intel.com>
Tue, 13 Oct 2009 02:34:56 +0000 (10:34 +0800)
committerLen Brown <len.brown@intel.com>
Wed, 25 Nov 2009 01:30:05 +0000 (20:30 -0500)
Using Scope(\) to change the scope to the root could cause a
single object memory leak.

Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/acpica/dswload.c

index 6de3a99d4cd4efa3b54fd154ce89bbba0e76b94f..10fc785178437155f31b6c469ad1029e70dadb65 100644 (file)
@@ -639,26 +639,42 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
                break;
 
        case AML_SCOPE_OP:
-               /*
-                * The Path is an object reference to an existing object.
-                * Don't enter the name into the namespace, but look it up
-                * for use later.
-                */
-               status =
-                   acpi_ns_lookup(walk_state->scope_info, buffer_ptr,
-                                  object_type, ACPI_IMODE_EXECUTE,
-                                  ACPI_NS_SEARCH_PARENT, walk_state, &(node));
-               if (ACPI_FAILURE(status)) {
-#ifdef ACPI_ASL_COMPILER
-                       if (status == AE_NOT_FOUND) {
-                               status = AE_OK;
-                       } else {
-                               ACPI_ERROR_NAMESPACE(buffer_ptr, status);
+
+               /* Special case for Scope(\) -> refers to the Root node */
+
+               if (op && (op->named.node == acpi_gbl_root_node)) {
+                       node = op->named.node;
+
+                       status =
+                           acpi_ds_scope_stack_push(node, object_type,
+                                                    walk_state);
+                       if (ACPI_FAILURE(status)) {
+                               return_ACPI_STATUS(status);
                        }
+               } else {
+                       /*
+                        * The Path is an object reference to an existing object.
+                        * Don't enter the name into the namespace, but look it up
+                        * for use later.
+                        */
+                       status =
+                           acpi_ns_lookup(walk_state->scope_info, buffer_ptr,
+                                          object_type, ACPI_IMODE_EXECUTE,
+                                          ACPI_NS_SEARCH_PARENT, walk_state,
+                                          &(node));
+                       if (ACPI_FAILURE(status)) {
+#ifdef ACPI_ASL_COMPILER
+                               if (status == AE_NOT_FOUND) {
+                                       status = AE_OK;
+                               } else {
+                                       ACPI_ERROR_NAMESPACE(buffer_ptr,
+                                                            status);
+                               }
 #else
-                       ACPI_ERROR_NAMESPACE(buffer_ptr, status);
+                               ACPI_ERROR_NAMESPACE(buffer_ptr, status);
 #endif
-                       return_ACPI_STATUS(status);
+                               return_ACPI_STATUS(status);
+                       }
                }
 
                /*