• Fam Zheng's avatar
    block: Walk bs->children carefully in bdrv_drain_recurse · 178bd438
    Fam Zheng authored
    
    
    The recursive bdrv_drain_recurse may run a block job completion BH that
    drops nodes. The coming changes will make that more likely and use-after-free
    would happen without this patch
    
    Stash the bs pointer and use bdrv_ref/bdrv_unref in addition to
    QLIST_FOREACH_SAFE to prevent such a case from happening.
    
    Since bdrv_unref accesses global state that is not protected by the AioContext
    lock, we cannot use bdrv_ref/bdrv_unref unconditionally.  Fortunately the
    protection is not needed in IOThread because only main loop can modify a graph
    with the AioContext lock held.
    
    Signed-off-by: default avatarFam Zheng <famz@redhat.com>
    Message-Id: <20170418143044.12187-2-famz@redhat.com>
    Reviewed-by: default avatarJeff Cody <jcody@redhat.com>
    Tested-by: default avatarJeff Cody <jcody@redhat.com>
    Signed-off-by: default avatarFam Zheng <famz@redhat.com>
    178bd438