Takashi Iwai 368fb8
From 05bb0167c80b8f93c6a4e0451b7da9b96db990c2 Mon Sep 17 00:00:00 2001
Takashi Iwai 368fb8
From: Tamir Duberstein <tamird@google.com>
Takashi Iwai 368fb8
Date: Wed, 5 Apr 2023 15:42:43 +0200
Takashi Iwai 368fb8
Subject: [PATCH] ACPICA: Avoid undefined behavior: applying zero offset to null pointer
Takashi Iwai 368fb8
Git-commit: 05bb0167c80b8f93c6a4e0451b7da9b96db990c2
Takashi Iwai 368fb8
Patch-mainline: v6.4-rc1
Takashi Iwai 368fb8
References: git-fixes
Takashi Iwai 368fb8
Takashi Iwai 368fb8
ACPICA commit 770653e3ba67c30a629ca7d12e352d83c2541b1e
Takashi Iwai 368fb8
Takashi Iwai 368fb8
Before this change we see the following UBSAN stack trace in Fuchsia:
Takashi Iwai 368fb8
Takashi Iwai 368fb8
  #0    0x000021e4213b3302 in acpi_ds_init_aml_walk(struct acpi_walk_state*, union acpi_parse_object*, struct acpi_namespace_node*, u8*, u32, struct acpi_evaluate_info*, u8) ../../third_party/acpica/source/components/dispatcher/dswstate.c:682 <platform-bus-x86.so>+0x233302
Takashi Iwai 368fb8
  #1.2  0x000020d0f660777f in ubsan_get_stack_trace() compiler-rt/lib/ubsan/ubsan_diag.cpp:41 <libclang_rt.asan.so>+0x3d77f
Takashi Iwai 368fb8
  #1.1  0x000020d0f660777f in maybe_print_stack_trace() compiler-rt/lib/ubsan/ubsan_diag.cpp:51 <libclang_rt.asan.so>+0x3d77f
Takashi Iwai 368fb8
  #1    0x000020d0f660777f in ~scoped_report() compiler-rt/lib/ubsan/ubsan_diag.cpp:387 <libclang_rt.asan.so>+0x3d77f
Takashi Iwai 368fb8
  #2    0x000020d0f660b96d in handlepointer_overflow_impl() compiler-rt/lib/ubsan/ubsan_handlers.cpp:809 <libclang_rt.asan.so>+0x4196d
Takashi Iwai 368fb8
  #3    0x000020d0f660b50d in compiler-rt/lib/ubsan/ubsan_handlers.cpp:815 <libclang_rt.asan.so>+0x4150d
Takashi Iwai 368fb8
  #4    0x000021e4213b3302 in acpi_ds_init_aml_walk(struct acpi_walk_state*, union acpi_parse_object*, struct acpi_namespace_node*, u8*, u32, struct acpi_evaluate_info*, u8) ../../third_party/acpica/source/components/dispatcher/dswstate.c:682 <platform-bus-x86.so>+0x233302
Takashi Iwai 368fb8
  #5    0x000021e4213e2369 in acpi_ds_call_control_method(struct acpi_thread_state*, struct acpi_walk_state*, union acpi_parse_object*) ../../third_party/acpica/source/components/dispatcher/dsmethod.c:605 <platform-bus-x86.so>+0x262369
Takashi Iwai 368fb8
  #6    0x000021e421437fac in acpi_ps_parse_aml(struct acpi_walk_state*) ../../third_party/acpica/source/components/parser/psparse.c:550 <platform-bus-x86.so>+0x2b7fac
Takashi Iwai 368fb8
  #7    0x000021e4214464d2 in acpi_ps_execute_method(struct acpi_evaluate_info*) ../../third_party/acpica/source/components/parser/psxface.c:244 <platform-bus-x86.so>+0x2c64d2
Takashi Iwai 368fb8
  #8    0x000021e4213aa052 in acpi_ns_evaluate(struct acpi_evaluate_info*) ../../third_party/acpica/source/components/namespace/nseval.c:250 <platform-bus-x86.so>+0x22a052
Takashi Iwai 368fb8
  #9    0x000021e421413dd8 in acpi_ns_init_one_device(acpi_handle, u32, void*, void**) ../../third_party/acpica/source/components/namespace/nsinit.c:735 <platform-bus-x86.so>+0x293dd8
Takashi Iwai 368fb8
  #10   0x000021e421429e98 in acpi_ns_walk_namespace(acpi_object_type, acpi_handle, u32, u32, acpi_walk_callback, acpi_walk_callback, void*, void**) ../../third_party/acpica/source/components/namespace/nswalk.c:298 <platform-bus-x86.so>+0x2a9e98
Takashi Iwai 368fb8
  #11   0x000021e4214131ac in acpi_ns_initialize_devices(u32) ../../third_party/acpica/source/components/namespace/nsinit.c:268 <platform-bus-x86.so>+0x2931ac
Takashi Iwai 368fb8
  #12   0x000021e42147c40d in acpi_initialize_objects(u32) ../../third_party/acpica/source/components/utilities/utxfinit.c:304 <platform-bus-x86.so>+0x2fc40d
Takashi Iwai 368fb8
  #13   0x000021e42126d603 in acpi::acpi_impl::initialize_acpi(acpi::acpi_impl*) ../../src/devices/board/lib/acpi/acpi-impl.cc:224 <platform-bus-x86.so>+0xed603
Takashi Iwai 368fb8
Takashi Iwai 368fb8
Add a simple check that avoids incrementing a pointer by zero, but
Takashi Iwai 368fb8
otherwise behaves as before. Note that our findings are against ACPICA
Takashi Iwai 368fb8
20221020, but the same code exists on master.
Takashi Iwai 368fb8
Takashi Iwai 368fb8
Link: https://github.com/acpica/acpica/commit/770653e3
Takashi Iwai 368fb8
Signed-off-by: Bob Moore <robert.moore@intel.com>
Takashi Iwai 368fb8
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Takashi Iwai 368fb8
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 368fb8
Takashi Iwai 368fb8
---
Takashi Iwai 368fb8
 drivers/acpi/acpica/dswstate.c | 11 ++++++++---
Takashi Iwai 368fb8
 1 file changed, 8 insertions(+), 3 deletions(-)
Takashi Iwai 368fb8
Takashi Iwai 368fb8
diff --git a/drivers/acpi/acpica/dswstate.c b/drivers/acpi/acpica/dswstate.c
Takashi Iwai 368fb8
index 95af370a7dce..d3841ded3a81 100644
Takashi Iwai 368fb8
--- a/drivers/acpi/acpica/dswstate.c
Takashi Iwai 368fb8
+++ b/drivers/acpi/acpica/dswstate.c
Takashi Iwai 368fb8
@@ -576,9 +576,14 @@ acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state,
Takashi Iwai 368fb8
 	ACPI_FUNCTION_TRACE(ds_init_aml_walk);
Takashi Iwai 368fb8
 
Takashi Iwai 368fb8
 	walk_state->parser_state.aml =
Takashi Iwai 368fb8
-	    walk_state->parser_state.aml_start = aml_start;
Takashi Iwai 368fb8
-	walk_state->parser_state.aml_end =
Takashi Iwai 368fb8
-	    walk_state->parser_state.pkg_end = aml_start + aml_length;
Takashi Iwai 368fb8
+	    walk_state->parser_state.aml_start =
Takashi Iwai 368fb8
+	    walk_state->parser_state.aml_end =
Takashi Iwai 368fb8
+	    walk_state->parser_state.pkg_end = aml_start;
Takashi Iwai 368fb8
+	/* Avoid undefined behavior: applying zero offset to null pointer */
Takashi Iwai 368fb8
+	if (aml_length != 0) {
Takashi Iwai 368fb8
+		walk_state->parser_state.aml_end += aml_length;
Takashi Iwai 368fb8
+		walk_state->parser_state.pkg_end += aml_length;
Takashi Iwai 368fb8
+	}
Takashi Iwai 368fb8
 
Takashi Iwai 368fb8
 	/* The next_op of the next_walk will be the beginning of the method */
Takashi Iwai 368fb8
 
Takashi Iwai 368fb8
-- 
Takashi Iwai 368fb8
2.35.3
Takashi Iwai 368fb8