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 /drivers | |
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>
Diffstat (limited to 'drivers')
-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 | } |