| From 2c7295bc7b4b48465a1409e719c8e77989e662f9 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 5 Apr 2023 15:42:43 +0200 |
| Subject: ACPICA: Avoid undefined behavior: applying zero offset to null |
| pointer |
| |
| From: Tamir Duberstein <tamird@google.com> |
| |
| [ Upstream commit 05bb0167c80b8f93c6a4e0451b7da9b96db990c2 ] |
| |
| ACPICA commit 770653e3ba67c30a629ca7d12e352d83c2541b1e |
| |
| Before this change we see the following UBSAN stack trace in Fuchsia: |
| |
| #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 |
| #1.2 0x000020d0f660777f in ubsan_get_stack_trace() compiler-rt/lib/ubsan/ubsan_diag.cpp:41 <libclang_rt.asan.so>+0x3d77f |
| #1.1 0x000020d0f660777f in maybe_print_stack_trace() compiler-rt/lib/ubsan/ubsan_diag.cpp:51 <libclang_rt.asan.so>+0x3d77f |
| #1 0x000020d0f660777f in ~scoped_report() compiler-rt/lib/ubsan/ubsan_diag.cpp:387 <libclang_rt.asan.so>+0x3d77f |
| #2 0x000020d0f660b96d in handlepointer_overflow_impl() compiler-rt/lib/ubsan/ubsan_handlers.cpp:809 <libclang_rt.asan.so>+0x4196d |
| #3 0x000020d0f660b50d in compiler-rt/lib/ubsan/ubsan_handlers.cpp:815 <libclang_rt.asan.so>+0x4150d |
| #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 |
| #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 |
| #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 |
| #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 |
| #8 0x000021e4213aa052 in acpi_ns_evaluate(struct acpi_evaluate_info*) ../../third_party/acpica/source/components/namespace/nseval.c:250 <platform-bus-x86.so>+0x22a052 |
| #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 |
| #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 |
| #11 0x000021e4214131ac in acpi_ns_initialize_devices(u32) ../../third_party/acpica/source/components/namespace/nsinit.c:268 <platform-bus-x86.so>+0x2931ac |
| #12 0x000021e42147c40d in acpi_initialize_objects(u32) ../../third_party/acpica/source/components/utilities/utxfinit.c:304 <platform-bus-x86.so>+0x2fc40d |
| #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 |
| |
| Add a simple check that avoids incrementing a pointer by zero, but |
| otherwise behaves as before. Note that our findings are against ACPICA |
| 20221020, but the same code exists on master. |
| |
| Link: https://github.com/acpica/acpica/commit/770653e3 |
| Signed-off-by: Bob Moore <robert.moore@intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/acpi/acpica/dswstate.c | 11 ++++++++--- |
| 1 file changed, 8 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/acpi/acpica/dswstate.c b/drivers/acpi/acpica/dswstate.c |
| index 0aa735d3b93cc..77076da2029d9 100644 |
| --- a/drivers/acpi/acpica/dswstate.c |
| +++ b/drivers/acpi/acpica/dswstate.c |
| @@ -576,9 +576,14 @@ acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state, |
| ACPI_FUNCTION_TRACE(ds_init_aml_walk); |
| |
| walk_state->parser_state.aml = |
| - walk_state->parser_state.aml_start = aml_start; |
| - walk_state->parser_state.aml_end = |
| - walk_state->parser_state.pkg_end = aml_start + aml_length; |
| + walk_state->parser_state.aml_start = |
| + walk_state->parser_state.aml_end = |
| + walk_state->parser_state.pkg_end = aml_start; |
| + /* Avoid undefined behavior: applying zero offset to null pointer */ |
| + if (aml_length != 0) { |
| + walk_state->parser_state.aml_end += aml_length; |
| + walk_state->parser_state.pkg_end += aml_length; |
| + } |
| |
| /* The next_op of the next_walk will be the beginning of the method */ |
| |
| -- |
| 2.39.2 |
| |