On 05.05.2021 09:59, Vladimir Sementsov-Ogievskiy wrote: > Split checking for reserved bits out of aligned offset check. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> > Reviewed-by: Eric Blake <ebl...@redhat.com>
Tested-by: Kirill Tkhai <ktk...@virtuozzo.com> > --- > block/qcow2.h | 1 + > block/qcow2-refcount.c | 10 +++++++++- > 2 files changed, 10 insertions(+), 1 deletion(-) > > diff --git a/block/qcow2.h b/block/qcow2.h > index 58fd7f1678..fd48a89d45 100644 > --- a/block/qcow2.h > +++ b/block/qcow2.h > @@ -591,6 +591,7 @@ typedef enum QCow2MetadataOverlap { > #define L2E_STD_RESERVED_MASK 0x3f000000000001feULL > > #define REFT_OFFSET_MASK 0xfffffffffffffe00ULL > +#define REFT_RESERVED_MASK 0x1ffULL > > #define INV_OFFSET (-1ULL) > > diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c > index 15c4f6b075..472a7026db 100644 > --- a/block/qcow2-refcount.c > +++ b/block/qcow2-refcount.c > @@ -2091,9 +2091,17 @@ static int check_refblocks(BlockDriverState *bs, > BdrvCheckResult *res, > > for(i = 0; i < s->refcount_table_size; i++) { > uint64_t offset, cluster; > - offset = s->refcount_table[i]; > + offset = s->refcount_table[i] & REFT_OFFSET_MASK; > cluster = offset >> s->cluster_bits; > > + if (s->refcount_table[i] & REFT_RESERVED_MASK) { > + fprintf(stderr, "ERROR refcount table entry %" PRId64 " has " > + "reserved bits set\n", i); > + res->corruptions++; > + *rebuild = true; > + continue; > + } > + > /* Refcount blocks are cluster aligned */ > if (offset_into_cluster(s, offset)) { > fprintf(stderr, "ERROR refcount block %" PRId64 " is not " >