mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
ACPI: SPCR: check if table->serial_port.access_width is too wide
If table->serial_port.access_width is more than 29, it causes undefined behavior when ACPI_ACCESS_BIT_WIDTH shifts it to (1 << ((size) + 2)): [ 0.000000] UBSAN: Undefined behaviour in drivers/acpi/spcr.c:114:11 [ 0.000000] shift exponent 102 is too large for 32-bit type 'int' Use the new ACPI_ACCESS_ defines to test that serial_port.access_width is less than 30 and set it to 6 if it is not. Signed-off-by: Mark Langsdorf <mlangsdo@redhat.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
bca21755b9
commit
ee3fe99ff0
@ -107,8 +107,13 @@ int __init acpi_parse_spcr(bool enable_earlycon, bool enable_console)
|
||||
pr_info("SPCR table version %d\n", table->header.revision);
|
||||
|
||||
if (table->serial_port.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
|
||||
switch (ACPI_ACCESS_BIT_WIDTH((
|
||||
table->serial_port.access_width))) {
|
||||
u32 bit_width = table->serial_port.access_width;
|
||||
|
||||
if (bit_width > ACPI_ACCESS_BIT_MAX) {
|
||||
pr_err("Unacceptable wide SPCR Access Width. Defaulting to byte size\n");
|
||||
bit_width = ACPI_ACCESS_BIT_DEFAULT;
|
||||
}
|
||||
switch (ACPI_ACCESS_BIT_WIDTH((bit_width))) {
|
||||
default:
|
||||
pr_err("Unexpected SPCR Access Width. Defaulting to byte size\n");
|
||||
fallthrough;
|
||||
|
Loading…
Reference in New Issue
Block a user