We need to prevent infinite loops and lockups Signed-off-by: Alexey Starikovskiy <astarikovskiy@xxxxxxx> --- drivers/acpi/dispatcher/dsopcode.c | 9 +++++++-- include/acpi/acstruct.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c index 6a81c44..e2a3535 100644 --- a/drivers/acpi/dispatcher/dsopcode.c +++ b/drivers/acpi/dispatcher/dsopcode.c @@ -1246,8 +1246,13 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, if (walk_state->control_state->common.value) { /* Predicate was true, go back and evaluate it again! */ - - status = AE_CTRL_PENDING; + /* Use hard limit to prevent infinite loops and lockups */ + if (++walk_state->cycle_count > 0xFFFF) { + status = AE_LIMIT; + ACPI_ERROR ((AE_INFO, "Infinite loop detected")); + } else { + status = AE_CTRL_PENDING; + } } ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, diff --git a/include/acpi/acstruct.h b/include/acpi/acstruct.h index 7980a26..fb4405e 100644 --- a/include/acpi/acstruct.h +++ b/include/acpi/acstruct.h @@ -94,6 +94,7 @@ struct acpi_walk_state { u32 method_breakpoint; /* For single stepping */ u32 user_breakpoint; /* User AML breakpoint */ u32 parse_flags; + u32 cycle_count; /* While loop cycle count */ struct acpi_parse_state parser_state; /* Current state of parser */ u32 prev_arg_types; -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html