• Borislav Petkov's avatar
    EDAC/ghes: Clear scanned data on unload · cd8100f1
    Borislav Petkov authored
    Commit
    
      b972fdba ("EDAC/ghes: Fix NULL pointer dereference in ghes_edac_register()")
    
    didn't clear all the information from the scanned system and, more
    specifically, left ghes_hw.num_dimms to its previous value. On a
    second load (CONFIG_DEBUG_TEST_DRIVER_REMOVE=y), the driver would use
    the leftover num_dimms value which is not 0 and thus the 0 check in
    enumerate_dimms() will get bypassed and it would go directly to the
    pointer deref:
    
      d = &hw->dimms[hw->num_dimms];
    
    which is, of course, NULL:
    
      #PF: supervisor write access in kernel mode
      #PF: error_code(0x0002) - not-present page
      PGD 0 P4D 0
      Oops: 0002 [#1] PREEMPT SMP
      CPU: 7 PID: 1 Comm: swapper/0 Not tainted 5.9.0-rc4+ #7
      Hardware name: GIGABYTE MZ01-CE1-00/MZ01-CE1-00, BIOS F02 08/29/2018
      RIP: 0010:enumerate_dimms.cold+0x7b/0x375
    
    Reset the whole ghes_hw on driver unregister so that no stale values are
    used on a second system scan.
    
    Fixes: b972fdba ("EDAC/ghes: Fix NULL pointer dereference in ghes_edac_register()")
    Cc: Shiju Jose <shiju.jose@huawei.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Link: https://lkml.kernel.org/r/20200911164817.GA19320@zn.tnic
    cd8100f1
ghes_edac.c 15.6 KB