Message ID | 20210505065955.13964-8-vsementsov@virtuozzo.com |
---|---|
State | New |
Headers | show |
Series | qcow2 check: check some reserved bits and subcluster bitmaps | expand |
On 05.05.2021 09:59, Vladimir Sementsov-Ogievskiy wrote: > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> > Reviewed-by: Eric Blake <eblake@redhat.com> > --- > block/qcow2.h | 1 + > block/qcow2-refcount.c | 12 +++++++++++- > 2 files changed, 12 insertions(+), 1 deletion(-) > > diff --git a/block/qcow2.h b/block/qcow2.h > index c0e1e83796..b8b1093b61 100644 > --- a/block/qcow2.h > +++ b/block/qcow2.h > @@ -587,6 +587,7 @@ typedef enum QCow2MetadataOverlap { > > #define L1E_OFFSET_MASK 0x00fffffffffffe00ULL > #define L2E_OFFSET_MASK 0x00fffffffffffe00ULL > +#define L2E_STD_RESERVED_MASK 0x3f000000000001feULL > > #define REFT_OFFSET_MASK 0xfffffffffffffe00ULL > > diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c > index 062ec48a15..47cc82449b 100644 > --- a/block/qcow2-refcount.c > +++ b/block/qcow2-refcount.c > @@ -1682,8 +1682,18 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res, > int csize; > l2_entry = get_l2_entry(s, l2_table, i); > uint64_t l2_bitmap = get_l2_bitmap(s, l2_table, i); > + QCow2ClusterType type = qcow2_get_cluster_type(bs, l2_entry); > > - switch (qcow2_get_cluster_type(bs, l2_entry)) { > + if (type != QCOW2_CLUSTER_COMPRESSED) { > + /* Check reserved bits of Standard Cluster Descriptor */ > + if (l2_entry & L2E_STD_RESERVED_MASK) { > + fprintf(stderr, "ERROR found l2 entry with reserved bits set: " > + "%" PRIx64, l2_entry); '\n' is missed. The rest is OK for me. Tested-by: Kirill Tkhai <ktkhai@virtuozzo.com> > + res->corruptions++; > + } > + } > + > + switch (type) { > case QCOW2_CLUSTER_COMPRESSED: > /* Compressed clusters don't have QCOW_OFLAG_COPIED */ > if (l2_entry & QCOW_OFLAG_COPIED) { >
diff --git a/block/qcow2.h b/block/qcow2.h index c0e1e83796..b8b1093b61 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -587,6 +587,7 @@ typedef enum QCow2MetadataOverlap { #define L1E_OFFSET_MASK 0x00fffffffffffe00ULL #define L2E_OFFSET_MASK 0x00fffffffffffe00ULL +#define L2E_STD_RESERVED_MASK 0x3f000000000001feULL #define REFT_OFFSET_MASK 0xfffffffffffffe00ULL diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c index 062ec48a15..47cc82449b 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -1682,8 +1682,18 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res, int csize; l2_entry = get_l2_entry(s, l2_table, i); uint64_t l2_bitmap = get_l2_bitmap(s, l2_table, i); + QCow2ClusterType type = qcow2_get_cluster_type(bs, l2_entry); - switch (qcow2_get_cluster_type(bs, l2_entry)) { + if (type != QCOW2_CLUSTER_COMPRESSED) { + /* Check reserved bits of Standard Cluster Descriptor */ + if (l2_entry & L2E_STD_RESERVED_MASK) { + fprintf(stderr, "ERROR found l2 entry with reserved bits set: " + "%" PRIx64, l2_entry); + res->corruptions++; + } + } + + switch (type) { case QCOW2_CLUSTER_COMPRESSED: /* Compressed clusters don't have QCOW_OFLAG_COPIED */ if (l2_entry & QCOW_OFLAG_COPIED) {