Commit 65f33bc0 authored by Max Reitz's avatar Max Reitz Committed by Stefan Hajnoczi
Browse files

qcow2: Fix alloc_clusters_noref() overflow detection



If the very first allocation has a length of 0, the free_cluster_index
is still 0 after the for loop, which means that subtracting one from it
will underflow and signal an invalid range of clusters by returning
-EFBIG. However, there is no such range, as its length is 0.

Fix this by preventing underflows on free_cluster_index during the
check.

Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
parent 43cbeffb
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -656,7 +656,9 @@ retry:

    /* Make sure that all offsets in the "allocated" range are representable
     * in an int64_t */
    if (s->free_cluster_index - 1 > (INT64_MAX >> s->cluster_bits)) {
    if (s->free_cluster_index > 0 &&
        s->free_cluster_index - 1 > (INT64_MAX >> s->cluster_bits))
    {
        return -EFBIG;
    }