]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86: hp-bioscfg: Fix kernel panic in GET_INSTANCE_ID macro
authorMario Limonciello <mario.limonciello@amd.com>
Thu, 15 Jan 2026 20:31:11 +0000 (14:31 -0600)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 20 Jan 2026 14:54:55 +0000 (16:54 +0200)
The GET_INSTANCE_ID macro that caused a kernel panic when accessing sysfs
attributes:

1. Off-by-one error: The loop condition used '<=' instead of '<',
   causing access beyond array bounds. Since array indices are 0-based
   and go from 0 to instances_count-1, the loop should use '<'.

2. Missing NULL check: The code dereferenced attr_name_kobj->name
   without checking if attr_name_kobj was NULL, causing a null pointer
   dereference in min_length_show() and other attribute show functions.

The panic occurred when fwupd tried to read BIOS configuration attributes:

  Oops: general protection fault [#1] SMP KASAN NOPTI
  KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007]
  RIP: 0010:min_length_show+0xcf/0x1d0 [hp_bioscfg]

Add a NULL check for attr_name_kobj before dereferencing and corrects
the loop boundary to match the pattern used elsewhere in the driver.

Cc: stable@vger.kernel.org
Fixes: 5f94f181ca25 ("platform/x86: hp-bioscfg: bioscfg-h")
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Link: https://patch.msgid.link/20260115203725.828434-3-mario.limonciello@amd.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/hp/hp-bioscfg/bioscfg.h

index 3166ef328ebae8a59e9d90fb11eafb320004db92..6b6748e4be2182e8c2dd1c84f73265576dc4af31 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <linux/wmi.h>
 #include <linux/types.h>
+#include <linux/string.h>
 #include <linux/device.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
@@ -285,8 +286,9 @@ enum hp_wmi_data_elements {
        {                                                               \
                int i;                                                  \
                                                                        \
-               for (i = 0; i <= bioscfg_drv.type##_instances_count; i++) { \
-                       if (!strcmp(kobj->name, bioscfg_drv.type##_data[i].attr_name_kobj->name)) \
+               for (i = 0; i < bioscfg_drv.type##_instances_count; i++) { \
+                       if (bioscfg_drv.type##_data[i].attr_name_kobj &&        \
+                           !strcmp(kobj->name, bioscfg_drv.type##_data[i].attr_name_kobj->name)) \
                                return i;                               \
                }                                                       \
                return -EIO;                                            \