ACPICA: Fixes for parameter validation.
[sfrench/cifs-2.6.git] / drivers / acpi / namespace / nsxfname.c
index 978213a6c19f23063c47e37073ba7b5b401a166d..408bd114572842bd19652ca8f6a84643236ced67 100644 (file)
@@ -84,38 +84,41 @@ acpi_get_handle(acpi_handle parent,
        /* Convert a parent handle to a prefix node */
 
        if (parent) {
-               status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
-               if (ACPI_FAILURE(status)) {
-                       return (status);
-               }
-
                prefix_node = acpi_ns_map_handle_to_node(parent);
                if (!prefix_node) {
-                       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
                        return (AE_BAD_PARAMETER);
                }
+       }
+
+       /*
+        * Valid cases are:
+        * 1) Fully qualified pathname
+        * 2) Parent + Relative pathname
+        *
+        * Error for <null Parent + relative path>
+        */
+       if (acpi_ns_valid_root_prefix(pathname[0])) {
 
-               status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
-               if (ACPI_FAILURE(status)) {
-                       return (status);
+               /* Pathname is fully qualified (starts with '\') */
+
+               /* Special case for root-only, since we can't search for it */
+
+               if (!ACPI_STRCMP(pathname, ACPI_NS_ROOT_PATH)) {
+                       *ret_handle =
+                           acpi_ns_convert_entry_to_handle(acpi_gbl_root_node);
+                       return (AE_OK);
                }
-       }
+       } else if (!prefix_node) {
 
-       /* Special case for root, since we can't search for it */
+               /* Relative path with null prefix is disallowed */
 
-       if (ACPI_STRCMP(pathname, ACPI_NS_ROOT_PATH) == 0) {
-               *ret_handle =
-                   acpi_ns_convert_entry_to_handle(acpi_gbl_root_node);
-               return (AE_OK);
+               return (AE_BAD_PARAMETER);
        }
 
-       /*
-        *  Find the Node and convert to a handle
-        */
-       status = acpi_ns_get_node(prefix_node, pathname, ACPI_NS_NO_UPSEARCH,
-                                 &node);
+       /* Find the Node and convert to a handle */
 
-       *ret_handle = NULL;
+       status =
+           acpi_ns_get_node(prefix_node, pathname, ACPI_NS_NO_UPSEARCH, &node);
        if (ACPI_SUCCESS(status)) {
                *ret_handle = acpi_ns_convert_entry_to_handle(node);
        }