• Toshi Kani's avatar
    EDAC/ghes: Set the DIMM label unconditionally · 5e2805d5
    Toshi Kani authored
    The commit
    
      cb51a371 ("EDAC/ghes: Setup DIMM label from DMI and use it in error reports")
    
    enforced that both the bank and device strings passed to
    dimm_setup_label() are not NULL.
    
    However, there are BIOSes, for example on a
    
      HPE ProLiant DL360 Gen10/ProLiant DL360 Gen10, BIOS U32 03/15/2019
    
    which don't populate both strings:
    
      Handle 0x0020, DMI type 17, 84 bytes
      Memory Device
              Array Handle: 0x0013
              Error Information Handle: Not Provided
              Total Width: 72 bits
              Data Width: 64 bits
              Size: 32 GB
              Form Factor: DIMM
              Set: None
              Locator: PROC 1 DIMM 1        <===== device
              Bank Locator: Not Specified   <===== bank
    
    This results in a buffer overflow because ghes_edac_register() calls
    strlen() on an uninitialized label, which had non-zero values left over
    from krealloc_array():
    
      detected buffer overflow in __fortify_strlen
       ------------[ cut here ]------------
       kernel BUG at lib/string_helpers.c:983!
       invalid opcode: 0000 [#1] PREEMPT SMP NOPTI
       CPU: 1 PID: 1 Comm: swapper/0 Tainted: G          I       5.18.6-200.fc36.x86_64 #1
       Hardware name: HPE ProLiant DL360 Gen10/ProLiant DL360 Gen10, BIOS U32 03/15/2019
       RIP: 0010:fortify_panic
       ...
       Call Trace:
        <TASK>
        ghes_edac_register.cold
        ghes_probe
        platform_probe
        really_probe
        __driver_probe_device
        driver_probe_device
        __driver_attach
        ? __device_attach_driver
        bus_for_each_dev
        bus_add_driver
        driver_register
        acpi_ghes_init
        acpi_init
        ? acpi_sleep_proc_init
        do_one_initcall
    
    The label contains garbage because the commit in Fixes reallocs the
    DIMMs array while scanning the system but doesn't clear the newly
    allocated memory.
    
    Change dimm_setup_label() to always initialize the label to fix the
    issue. Set it to the empty string in case BIOS does not provide both
    bank and device so that ghes_edac_register() can keep the default label
    given by edac_mc_alloc_dimms().
    
      [ bp: Rewrite commit message. ]
    
    Fixes: b9cae277 ("EDAC/ghes: Scan the system once on driver init")
    Co-developed-by: default avatarRobert Richter <rric@kernel.org>
    Signed-off-by: default avatarRobert Richter <rric@kernel.org>
    Signed-off-by: default avatarToshi Kani <toshi.kani@hpe.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Tested-by: default avatarRobert Elliott <elliott@hpe.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20220719220124.760359-1-toshi.kani@hpe.com
    5e2805d5
ghes_edac.c 12.5 KB