• Josh Durgin's avatar
    rbd: fix use-after free of rbd_dev->disk · 9875201e
    Josh Durgin authored
    Removing a device deallocates the disk, unschedules the watch, and
    finally cleans up the rbd_dev structure. rbd_dev_refresh(), called
    from the watch callback, updates the disk size and rbd_dev
    structure. With no locking between them, rbd_dev_refresh() may use the
    device or rbd_dev after they've been freed.
    
    To fix this, check whether RBD_DEV_FLAG_REMOVING is set before
    updating the disk size in rbd_dev_refresh(). In order to prevent a
    race where rbd_dev_refresh() is already revalidating the disk when
    rbd_remove() is called, move the call to rbd_bus_del_dev() after the
    watch is unregistered and all notifies are complete. It's safe to
    defer deleting this structure because no new requests can be submitted
    once the RBD_DEV_FLAG_REMOVING is set, since the device cannot be
    opened.
    
    Fixes: http://tracker.ceph.com/issues/5636Signed-off-by: default avatarJosh Durgin <josh.durgin@inktank.com>
    Reviewed-by: default avatarAlex Elder <elder@linaro.org>
    9875201e
rbd.c 136 KB