]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
ACPICA: Fix possible fault if return Package objects contain NULL elements
authorBob Moore <robert.moore@intel.com>
Thu, 12 Nov 2009 01:36:00 +0000 (09:36 +0800)
committerLen Brown <len.brown@intel.com>
Wed, 25 Nov 2009 02:31:10 +0000 (21:31 -0500)
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>
drivers/acpi/acpica/nspredef.c

index f8427afeebdfb2017043e753888a9aa8d0250ad7..40280981033e1a8781161033b2a1af17bf0c2309 100644 (file)
@@ -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;