Skip to content
  • Kevin Wolf's avatar
    qcow2: Don't rely on free_cluster_index in alloc_refcount_block() (CVE-2014-0147) · b106ad91
    Kevin Wolf authored
    
    
    free_cluster_index is only correct if update_refcount() was called from
    an allocation function, and even there it's brittle because it's used to
    protect unfinished allocations which still have a refcount of 0 - if it
    moves in the wrong place, the unfinished allocation can be corrupted.
    
    So not using it any more seems to be a good idea. Instead, use the
    first requested cluster to do the calculations. Return -EAGAIN if
    unfinished allocations could become invalid and let the caller restart
    its search for some free clusters.
    
    The context of creating a snapsnot is one situation where
    update_refcount() is called outside of a cluster allocation. For this
    case, the change fixes a buffer overflow if a cluster is referenced in
    an L2 table that cannot be represented by an existing refcount block.
    (new_table[refcount_table_index] was out of bounds)
    
    [Bump the qemu-iotests 026 refblock_alloc.write leak count from 10 to
    11.
    --Stefan]
    
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    b106ad91