Commit 3f20ea15 authored by Erik Schmauss's avatar Erik Schmauss Committed by Rafael J. Wysocki
Browse files

ACPICA: Disassembler: skip parsing of incorrect external declarations

ACPICA commit ed25461901d34120067b07ec280af30abc0458f1

Link: https://github.com/acpica/acpica/commit/ed254619


Signed-off-by: default avatarErik Schmauss <erik.schmauss@intel.com>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 4e6cbe56
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -359,6 +359,32 @@ acpi_ps_create_op(struct acpi_walk_state *walk_state,
		    acpi_ps_build_named_op(walk_state, aml_op_start, op,
					   &named_op);
		acpi_ps_free_op(op);

#ifdef ACPI_ASL_COMPILER
		if (acpi_gbl_disasm_flag
		    && walk_state->opcode == AML_EXTERNAL_OP
		    && status == AE_NOT_FOUND) {
			/*
			 * If parsing of AML_EXTERNAL_OP's name path fails, then skip
			 * past this opcode and keep parsing. This is a much better
			 * alternative than to abort the entire disassembler. At this
			 * point, the parser_state is at the end of the namepath of the
			 * external declaration opcode. Setting walk_state->Aml to
			 * walk_state->parser_state.Aml + 2 moves increments the
			 * walk_state->Aml past the object type and the paramcount of the
			 * external opcode. For the error message, only print the AML
			 * offset. We could attempt to print the name but this may cause
			 * a segmentation fault when printing the namepath because the
			 * AML may be incorrect.
			 */
			acpi_os_printf
			    ("// Invalid external declaration at AML offset 0x%x.\n",
			     walk_state->aml -
			     walk_state->parser_state.aml_start);
			walk_state->aml = walk_state->parser_state.aml + 2;
			return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
		}
#endif
		if (ACPI_FAILURE(status)) {
			return_ACPI_STATUS(status);
		}