Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 419a909d authored by Bob Moore's avatar Bob Moore Committed by Len Brown
Browse files

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: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 2263576c
Loading
Loading
Loading
Loading
+42 −1
Original line number Diff line number Diff line
@@ -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;