diff options
Diffstat (limited to 'drivers/acpi/acpica/utresrc.c')
-rw-r--r-- | drivers/acpi/acpica/utresrc.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/acpi/acpica/utresrc.c b/drivers/acpi/acpica/utresrc.c index 16f9a7035b39..cff7901f7866 100644 --- a/drivers/acpi/acpica/utresrc.c +++ b/drivers/acpi/acpica/utresrc.c @@ -57,6 +57,8 @@ const u8 acpi_gbl_resource_aml_sizes[] = { ACPI_AML_SIZE_LARGE(struct aml_resource_pin_group), ACPI_AML_SIZE_LARGE(struct aml_resource_pin_group_function), ACPI_AML_SIZE_LARGE(struct aml_resource_pin_group_config), + ACPI_AML_SIZE_LARGE(struct aml_resource_clock_input), + }; const u8 acpi_gbl_resource_aml_serial_bus_sizes[] = { @@ -114,6 +116,7 @@ static const u8 acpi_gbl_resource_types[] = { ACPI_VARIABLE_LENGTH, /* 10 pin_group */ ACPI_VARIABLE_LENGTH, /* 11 pin_group_function */ ACPI_VARIABLE_LENGTH, /* 12 pin_group_config */ + ACPI_VARIABLE_LENGTH, /* 13 clock_input */ }; /******************************************************************************* @@ -358,16 +361,20 @@ acpi_ut_validate_resource(struct acpi_walk_state *walk_state, aml_resource = ACPI_CAST_PTR(union aml_resource, aml); if (resource_type == ACPI_RESOURCE_NAME_SERIAL_BUS) { + /* Avoid undefined behavior: member access within misaligned address */ + + struct aml_resource_common_serialbus common_serial_bus; + memcpy(&common_serial_bus, aml_resource, + sizeof(common_serial_bus)); + /* Validate the bus_type field */ - if ((aml_resource->common_serial_bus.type == 0) || - (aml_resource->common_serial_bus.type > - AML_RESOURCE_MAX_SERIALBUSTYPE)) { + if ((common_serial_bus.type == 0) || + (common_serial_bus.type > AML_RESOURCE_MAX_SERIALBUSTYPE)) { if (walk_state) { ACPI_ERROR((AE_INFO, "Invalid/unsupported SerialBus resource descriptor: BusType 0x%2.2X", - aml_resource->common_serial_bus. - type)); + common_serial_bus.type)); } return (AE_AML_INVALID_RESOURCE_TYPE); } |