Skip to content
  • Hanna Reitz's avatar
    d470ad42
    block: Guard against NULL bs->drv · d470ad42
    Hanna Reitz authored
    
    
    We currently do not guard everywhere against a NULL bs->drv where we
    should be doing so.  Most of the places fixed here just do not care
    about that case at all.
    
    Some care implicitly, e.g. through a prior function call to
    bdrv_getlength() which would always fail for an ejected BDS.  Add an
    assert there to make it more obvious.
    
    Other places seem to care, but do so insufficiently: Freeing clusters in
    a qcow2 image is an error-free operation, but it may leave the image in
    an unusable state anyway.  Giving qcow2_free_clusters() an error code is
    not really viable, it is much easier to note that bs->drv may be NULL
    even after a successful driver call.  This concerns bdrv_co_flush(), and
    the way the check is added to bdrv_co_pdiscard() (in every iteration
    instead of only once).
    
    Finally, some places employ at least an assert(bs->drv); somewhere, that
    may be reasonable (such as in the reopen code), but in
    bdrv_has_zero_init(), it is definitely not.  Returning 0 there in case
    of an ejected BDS saves us much headache instead.
    
    Reported-by: default avatarR. Nageswara Sastry <nasastry@in.ibm.com>
    Buglink: https://bugs.launchpad.net/qemu/+bug/1728660
    
    
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    Message-id: 20171110203111.7666-4-mreitz@redhat.com
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    d470ad42
    block: Guard against NULL bs->drv
    Hanna Reitz authored
    
    
    We currently do not guard everywhere against a NULL bs->drv where we
    should be doing so.  Most of the places fixed here just do not care
    about that case at all.
    
    Some care implicitly, e.g. through a prior function call to
    bdrv_getlength() which would always fail for an ejected BDS.  Add an
    assert there to make it more obvious.
    
    Other places seem to care, but do so insufficiently: Freeing clusters in
    a qcow2 image is an error-free operation, but it may leave the image in
    an unusable state anyway.  Giving qcow2_free_clusters() an error code is
    not really viable, it is much easier to note that bs->drv may be NULL
    even after a successful driver call.  This concerns bdrv_co_flush(), and
    the way the check is added to bdrv_co_pdiscard() (in every iteration
    instead of only once).
    
    Finally, some places employ at least an assert(bs->drv); somewhere, that
    may be reasonable (such as in the reopen code), but in
    bdrv_has_zero_init(), it is definitely not.  Returning 0 there in case
    of an ejected BDS saves us much headache instead.
    
    Reported-by: default avatarR. Nageswara Sastry <nasastry@in.ibm.com>
    Buglink: https://bugs.launchpad.net/qemu/+bug/1728660
    
    
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    Message-id: 20171110203111.7666-4-mreitz@redhat.com
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Loading