diff options
author | Bob Moore <robert.moore@intel.com> | 2009-11-12 09:36:00 +0800 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2009-11-24 21:31:10 -0500 |
commit | 419a909dd10142d015dd96457db1b1eda643f89e (patch) | |
tree | da9db6fc6e669909b08adae1366a34161faef113 /drivers/acpi | |
parent | 2263576cfc6e8f6ab038126c3254404b9fcb1c33 (diff) | |
download | linux-419a909dd10142d015dd96457db1b1eda643f89e.tar.gz linux-419a909dd10142d015dd96457db1b1eda643f89e.tar.bz2 linux-419a909dd10142d015dd96457db1b1eda643f89e.zip |
ACPICA: Fix possible fault if return Package objects contain NULL elements
For predefined name validation. Also adds a warning if a NULL
element is followed by any non-null elements. ACPICA BZ 813, 814.
http://www.acpica.org/bugzilla/show_bug.cgi?id=813
http://www.acpica.org/bugzilla/show_bug.cgi?id=814
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/acpica/nspredef.c | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/drivers/acpi/acpica/nspredef.c b/drivers/acpi/acpica/nspredef.c index f8427afeebdf..40280981033e 100644 --- a/drivers/acpi/acpica/nspredef.c +++ b/drivers/acpi/acpica/nspredef.c @@ -601,7 +601,8 @@ acpi_ns_check_package(struct acpi_predefined_data *data, * there is only one entry). We may be able to repair this by * wrapping the returned Package with a new outer Package. */ - if ((*elements)->common.type != ACPI_TYPE_PACKAGE) { + if (*elements + && ((*elements)->common.type != ACPI_TYPE_PACKAGE)) { /* Create the new outer package and populate it */ @@ -673,6 +674,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, union acpi_operand_object *sub_package; union acpi_operand_object **sub_elements; acpi_status status; + u8 non_trailing_null = FALSE; u32 expected_count; u32 i; u32 j; @@ -680,6 +682,45 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, /* Validate each sub-Package in the parent Package */ for (i = 0; i < count; i++) { + /* + * Handling for NULL package elements. For now, we will simply allow + * a parent package with trailing NULL elements. This can happen if + * the package was defined to be longer than the initializer list. + * This is legal as per the ACPI specification. It is often used + * to allow for dynamic initialization of a Package. + * + * A future enhancement may be to simply truncate the package to + * remove the trailing NULL elements. + */ + if (!(*elements)) { + if (!non_trailing_null) { + + /* Ensure the remaining elements are all NULL */ + + for (j = 1; j < (count - i + 1); j++) { + if (elements[j]) { + non_trailing_null = TRUE; + } + } + + if (!non_trailing_null) { + + /* Ignore the trailing NULL elements */ + + return (AE_OK); + } + } + + /* There are trailing non-null elements, issue warning */ + + ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, + data->node_flags, + "Found NULL element at package index %u", + i)); + elements++; + continue; + } + sub_package = *elements; sub_elements = sub_package->package.elements; |