• Qiu-ji Chen's avatar
    drbd: Fix atomicity violation in drbd_uuid_set_bm() · 2f02b5af
    Qiu-ji Chen authored
    The violation of atomicity occurs when the drbd_uuid_set_bm function is
    executed simultaneously with modifying the value of
    device->ldev->md.uuid[UI_BITMAP]. Consider a scenario where, while
    device->ldev->md.uuid[UI_BITMAP] passes the validity check when its
    value is not zero, the value of device->ldev->md.uuid[UI_BITMAP] is
    written to zero. In this case, the check in drbd_uuid_set_bm might refer
    to the old value of device->ldev->md.uuid[UI_BITMAP] (before locking),
    which allows an invalid value to pass the validity check, resulting in
    inconsistency.
    
    To address this issue, it is recommended to include the data validity
    check within the locked section of the function. This modification
    ensures that the value of device->ldev->md.uuid[UI_BITMAP] does not
    change during the validation process, thereby maintaining its integrity.
    
    This possible bug is found by an experimental static analysis tool
    developed by our team. This tool analyzes the locking APIs to extract
    function pairs that can be concurrently executed, and then analyzes the
    instructions in the paired functions to identify possible concurrency
    bugs including data races and atomicity violations.
    
    Fixes: 9f2247bb ("drbd: Protect accesses to the uuid set with a spinlock")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarQiu-ji Chen <chenqiuji666@gmail.com>
    Reviewed-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
    Link: https://lore.kernel.org/r/20240913083504.10549-1-chenqiuji666@gmail.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    2f02b5af
drbd_main.c 109 KB