Skip to content

Commit

Permalink
ACPICA: AML Parser: fix parse loop to correctly skip erroneous extend…
Browse files Browse the repository at this point in the history
…ed opcodes

AML opcodes come in two lengths: 1-byte opcodes and 2-byte, extended opcodes.
If an error occurs due to illegal opcodes during table load, the AML parser
needs to continue loading the table. In order to do this, it needs to skip
parsing of the offending opcode and operands associated with that opcode.

This change fixes the AML parse loop to correctly skip parsing of incorrect
extended opcodes. Previously, only the short opcodes were skipped correctly.

Signed-off-by: Erik Schmauss <erik.schmauss@intel.com>
Cc: All applicable <stable@vger.kernel.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Erik Schmauss authored and Rafael J. Wysocki committed Oct 18, 2018
1 parent 4abb951 commit c64baa3
Showing 1 changed file with 13 additions and 1 deletion.
14 changes: 13 additions & 1 deletion drivers/acpi/acpica/psloop.c
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,7 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
union acpi_parse_object *op = NULL; /* current op */
struct acpi_parse_state *parser_state;
u8 *aml_op_start = NULL;
u8 opcode_length;

ACPI_FUNCTION_TRACE_PTR(ps_parse_loop, walk_state);

Expand Down Expand Up @@ -540,8 +541,19 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
"Skip parsing opcode %s",
acpi_ps_get_opcode_name
(walk_state->opcode)));

/*
* Determine the opcode length before skipping the opcode.
* An opcode can be 1 byte or 2 bytes in length.
*/
opcode_length = 1;
if ((walk_state->opcode & 0xFF00) ==
AML_EXTENDED_OPCODE) {
opcode_length = 2;
}
walk_state->parser_state.aml =
walk_state->aml + 1;
walk_state->aml + opcode_length;

walk_state->parser_state.aml =
acpi_ps_get_next_package_end
(&walk_state->parser_state);
Expand Down

0 comments on commit c64baa3

Please sign in to comment.