qcow2: fix range check

QCowL2Meta::offset is not cluster aligned but only sector aligned
however nb_clusters count cluster from cluster start.
This fix range check. Note that old code have no corruption issues
related to this check cause it only cause intersection to occur
when shouldn't.

Signed-off-by: Frediano Ziglio <freddy77@gmail.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
master
Frediano Ziglio 2011-09-10 10:23:56 +02:00 committed by Kevin Wolf
parent dea43a65d6
commit ee18e73023
1 changed files with 7 additions and 7 deletions

View File

@ -776,17 +776,17 @@ again:
*/
QLIST_FOREACH(old_alloc, &s->cluster_allocs, next_in_flight) {
uint64_t end_offset = offset + nb_clusters * s->cluster_size;
uint64_t old_offset = old_alloc->offset;
uint64_t old_end_offset = old_alloc->offset +
old_alloc->nb_clusters * s->cluster_size;
uint64_t start = offset >> s->cluster_bits;
uint64_t end = start + nb_clusters;
uint64_t old_start = old_alloc->offset >> s->cluster_bits;
uint64_t old_end = old_start + old_alloc->nb_clusters;
if (end_offset < old_offset || offset > old_end_offset) {
if (end < old_start || start > old_end) {
/* No intersection */
} else {
if (offset < old_offset) {
if (start < old_start) {
/* Stop at the start of a running allocation */
nb_clusters = (old_offset - offset) >> s->cluster_bits;
nb_clusters = old_start - start;
} else {
nb_clusters = 0;
}