]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ACPICA: Avoid walking the Namespace if start_node is NULL
authorCryolitia PukNgae <cryolitia.pukngae@linux.dev>
Tue, 25 Nov 2025 08:14:38 +0000 (16:14 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 25 Nov 2025 21:14:11 +0000 (22:14 +0100)
Although commit 0c9992315e73 ("ACPICA: Avoid walking the ACPI Namespace
if it is not there") fixed the situation when both start_node and
acpi_gbl_root_node are NULL, the Linux kernel mainline now still crashed
on Honor Magicbook 14 Pro [1].

That happens due to the access to the member of parent_node in
acpi_ns_get_next_node().  The NULL pointer dereference will always
happen, no matter whether or not the start_node is equal to
ACPI_ROOT_OBJECT, so move the check of start_node being NULL
out of the if block.

Unfortunately, all the attempts to contact Honor have failed, they
refused to provide any technical support for Linux.

The bad DSDT table's dump could be found on GitHub [2].

DMI: HONOR FMB-P/FMB-P-PCB, BIOS 1.13 05/08/2025

Link: https://github.com/acpica/acpica/commit/1c1b57b9eba4554cb132ee658dd942c0210ed20d
Link: https://gist.github.com/Cryolitia/a860ffc97437dcd2cd988371d5b73ed7
Link: https://github.com/denis-bb/honor-fmb-p-dsdt
Signed-off-by: Cryolitia PukNgae <cryolitia.pukngae@linux.dev>
Reviewed-by: WangYuli <wangyl5933@chinaunicom.cn>
[ rjw: Subject adjustment, changelog edits ]
Link: https://patch.msgid.link/20251125-acpica-v1-1-99e63b1b25f8@linux.dev
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/nswalk.c

index a2ac06a26e921c07fee28b3acc5401c3352faddb..5670ff5a43cd48de4b7022df1e69979124bbc849 100644 (file)
@@ -169,9 +169,12 @@ acpi_ns_walk_namespace(acpi_object_type type,
 
        if (start_node == ACPI_ROOT_OBJECT) {
                start_node = acpi_gbl_root_node;
-               if (!start_node) {
-                       return_ACPI_STATUS(AE_NO_NAMESPACE);
-               }
+       }
+
+       /* Avoid walking the namespace if the StartNode is NULL */
+
+       if (!start_node) {
+               return_ACPI_STATUS(AE_NO_NAMESPACE);
        }
 
        /* Null child means "get first node" */