diff options
| author | Bob Moore <robert.moore@intel.com> | 2007-02-02 11:48:22 -0500 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2007-02-02 21:14:28 -0500 |
| commit | f1c2b1daf040d2feebfbbd4a0cd80cde856fc031 (patch) | |
| tree | 3bf02e1c53c74115a5a37353e0adbd77c4fb30f4 | |
| parent | c1014629c0fc563be65e675e72bcc9bd7db50195 (diff) | |
ACPICA: Fixes for parameter validation.
Extra checks for valid handle/path combinations, BZ 478
Signed-off-by: Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
| -rw-r--r-- | drivers/acpi/namespace/nsxfname.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/drivers/acpi/namespace/nsxfname.c b/drivers/acpi/namespace/nsxfname.c index 978213a6c19f..408bd1145728 100644 --- a/drivers/acpi/namespace/nsxfname.c +++ b/drivers/acpi/namespace/nsxfname.c | |||
| @@ -84,38 +84,41 @@ acpi_get_handle(acpi_handle parent, | |||
| 84 | /* Convert a parent handle to a prefix node */ | 84 | /* Convert a parent handle to a prefix node */ |
| 85 | 85 | ||
| 86 | if (parent) { | 86 | if (parent) { |
| 87 | status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); | ||
| 88 | if (ACPI_FAILURE(status)) { | ||
| 89 | return (status); | ||
| 90 | } | ||
| 91 | |||
| 92 | prefix_node = acpi_ns_map_handle_to_node(parent); | 87 | prefix_node = acpi_ns_map_handle_to_node(parent); |
| 93 | if (!prefix_node) { | 88 | if (!prefix_node) { |
| 94 | (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); | ||
| 95 | return (AE_BAD_PARAMETER); | 89 | return (AE_BAD_PARAMETER); |
| 96 | } | 90 | } |
| 91 | } | ||
| 92 | |||
| 93 | /* | ||
| 94 | * Valid cases are: | ||
| 95 | * 1) Fully qualified pathname | ||
| 96 | * 2) Parent + Relative pathname | ||
| 97 | * | ||
| 98 | * Error for <null Parent + relative path> | ||
| 99 | */ | ||
| 100 | if (acpi_ns_valid_root_prefix(pathname[0])) { | ||
| 97 | 101 | ||
| 98 | status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); | 102 | /* Pathname is fully qualified (starts with '\') */ |
| 99 | if (ACPI_FAILURE(status)) { | 103 | |
| 100 | return (status); | 104 | /* Special case for root-only, since we can't search for it */ |
| 105 | |||
| 106 | if (!ACPI_STRCMP(pathname, ACPI_NS_ROOT_PATH)) { | ||
| 107 | *ret_handle = | ||
| 108 | acpi_ns_convert_entry_to_handle(acpi_gbl_root_node); | ||
| 109 | return (AE_OK); | ||
| 101 | } | 110 | } |
| 102 | } | 111 | } else if (!prefix_node) { |
| 103 | 112 | ||
| 104 | /* Special case for root, since we can't search for it */ | 113 | /* Relative path with null prefix is disallowed */ |
| 105 | 114 | ||
| 106 | if (ACPI_STRCMP(pathname, ACPI_NS_ROOT_PATH) == 0) { | 115 | return (AE_BAD_PARAMETER); |
| 107 | *ret_handle = | ||
| 108 | acpi_ns_convert_entry_to_handle(acpi_gbl_root_node); | ||
| 109 | return (AE_OK); | ||
| 110 | } | 116 | } |
| 111 | 117 | ||
| 112 | /* | 118 | /* Find the Node and convert to a handle */ |
| 113 | * Find the Node and convert to a handle | ||
| 114 | */ | ||
| 115 | status = acpi_ns_get_node(prefix_node, pathname, ACPI_NS_NO_UPSEARCH, | ||
| 116 | &node); | ||
| 117 | 119 | ||
| 118 | *ret_handle = NULL; | 120 | status = |
| 121 | acpi_ns_get_node(prefix_node, pathname, ACPI_NS_NO_UPSEARCH, &node); | ||
| 119 | if (ACPI_SUCCESS(status)) { | 122 | if (ACPI_SUCCESS(status)) { |
| 120 | *ret_handle = acpi_ns_convert_entry_to_handle(node); | 123 | *ret_handle = acpi_ns_convert_entry_to_handle(node); |
| 121 | } | 124 | } |
