Skip to content
  • Manos Pitsidianakis's avatar
    180ca19a
    block: fix leaks in bdrv_open_driver() · 180ca19a
    Manos Pitsidianakis authored
    
    
    bdrv_open_driver() is called in two places, bdrv_new_open_driver() and
    bdrv_open_common(). In the latter, failure cleanup in is in its caller,
    bdrv_open_inherit(), which unrefs the bs->file of the failed driver open
    if it exists.
    
    Let's move the bs->file cleanup to bdrv_open_driver() to take care of
    all callers and do not set bs->drv to NULL unless the driver's open
    function failed. When bs is destroyed by removing its last reference, it
    calls bdrv_close() which checks bs->drv to perform the needed cleanups
    and also call the driver's close function. Since it cleans up options
    and opaque we must take care not leave dangling pointers.
    
    The error paths in bdrv_open_driver() are now two:
    If open fails, drv->bdrv_close() should not be called. Unref the child
    if it exists, free what we allocated and set bs->drv to NULL. Return the
    error and let callers free their stuff.
    
    If open succeeds but we fail after, return the error and let callers
    unref and delete their bs, while cleaning up their allocations.
    
    Signed-off-by: default avatarManos Pitsidianakis <el13635@mail.ntua.gr>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    180ca19a
    block: fix leaks in bdrv_open_driver()
    Manos Pitsidianakis authored
    
    
    bdrv_open_driver() is called in two places, bdrv_new_open_driver() and
    bdrv_open_common(). In the latter, failure cleanup in is in its caller,
    bdrv_open_inherit(), which unrefs the bs->file of the failed driver open
    if it exists.
    
    Let's move the bs->file cleanup to bdrv_open_driver() to take care of
    all callers and do not set bs->drv to NULL unless the driver's open
    function failed. When bs is destroyed by removing its last reference, it
    calls bdrv_close() which checks bs->drv to perform the needed cleanups
    and also call the driver's close function. Since it cleans up options
    and opaque we must take care not leave dangling pointers.
    
    The error paths in bdrv_open_driver() are now two:
    If open fails, drv->bdrv_close() should not be called. Unref the child
    if it exists, free what we allocated and set bs->drv to NULL. Return the
    error and let callers free their stuff.
    
    If open succeeds but we fail after, return the error and let callers
    unref and delete their bs, while cleaning up their allocations.
    
    Signed-off-by: default avatarManos Pitsidianakis <el13635@mail.ntua.gr>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Loading