• Dan Williams's avatar
    libnvdimm/dimm: Avoid race between probe and available_slots_show() · 7018c897
    Dan Williams authored
    Richard reports that the following test:
    
    (while true; do
         cat /sys/bus/nd/devices/nmem*/available_slots 2>&1 > /dev/null
     done) &
    
    while true; do
         for i in $(seq 0 4); do
             echo nmem$i > /sys/bus/nd/drivers/nvdimm/bind
         done
         for i in $(seq 0 4); do
             echo nmem$i > /sys/bus/nd/drivers/nvdimm/unbind
         done
     done
    
    ...fails with a crash signature like:
    
        divide error: 0000 [#1] SMP KASAN PTI
        RIP: 0010:nd_label_nfree+0x134/0x1a0 [libnvdimm]
        [..]
        Call Trace:
         available_slots_show+0x4e/0x120 [libnvdimm]
         dev_attr_show+0x42/0x80
         ? memset+0x20/0x40
         sysfs_kf_seq_show+0x218/0x410
    
    The root cause is that available_slots_show() consults driver-data, but
    fails to synchronize against device-unbind setting up a TOCTOU race to
    access uninitialized memory.
    
    Validate driver-data under the device-lock.
    
    Fixes: 4d88a97a ("libnvdimm, nvdimm: dimm driver and base libnvdimm device-driver infrastructure")
    Cc: <stable@vger.kernel.org>
    Cc: Vishal Verma <vishal.l.verma@intel.com>
    Cc: Dave Jiang <dave.jiang@intel.com>
    Cc: Ira Weiny <ira.weiny@intel.com>
    Cc: Coly Li <colyli@suse.com>
    Reported-by: default avatarRichard Palethorpe <rpalethorpe@suse.com>
    Acked-by: default avatarRichard Palethorpe <rpalethorpe@suse.com>
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    7018c897
dimm_devs.c 24.9 KB