Message ID | 20210914122454.141075-8-vsementsov@virtuozzo.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qcow2 check: check some reserved bits and subcluster bitmaps | expand |
On 14.09.21 14:24, Vladimir Sementsov-Ogievskiy wrote: > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> > Reviewed-by: Eric Blake <eblake@redhat.com> > Tested-by: Kirill Tkhai <ktkhai@virtuozzo.com> > Reviewed-by: Hanna Reitz <hreitz@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 9a5ae3cac4..5d57e677bc 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); > l2_bitmap = get_l2_bitmap(s, l2_table, i); > + QCow2ClusterType type = qcow2_get_cluster_type(bs, l2_entry); Hm, with l2_bitmap being declared next to l2_entry, this is now the patch that adds a declaration after a statement here. (The possible resolutions seem to be the same, either move the declaration up to the function’s root block, or move l2_entry and l2_bitmap’s declarations here...) (I don’t think we need a v5 for this, it should be fine if you tell me which way you prefer.) Hanna
14.09.2021 20:15, Hanna Reitz wrote: > On 14.09.21 14:24, Vladimir Sementsov-Ogievskiy wrote: >> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> >> Reviewed-by: Eric Blake <eblake@redhat.com> >> Tested-by: Kirill Tkhai <ktkhai@virtuozzo.com> >> Reviewed-by: Hanna Reitz <hreitz@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 9a5ae3cac4..5d57e677bc 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); >> l2_bitmap = get_l2_bitmap(s, l2_table, i); >> + QCow2ClusterType type = qcow2_get_cluster_type(bs, l2_entry); Oh :( > > Hm, with l2_bitmap being declared next to l2_entry, this is now the patch that adds a declaration after a statement here. > > (The possible resolutions seem to be the same, either move the declaration up to the function’s root block, or move l2_entry and l2_bitmap’s declarations here...) > > (I don’t think we need a v5 for this, it should be fine if you tell me which way you prefer.) > I'd keep type here: QCow2ClusterType type; l2_entry = ... l2_bitmap = ... type = qcow2_get_cluster_type(bs, l2_entry);
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 9a5ae3cac4..5d57e677bc 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); 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 "\n", l2_entry); + res->corruptions++; + } + } + + switch (type) { case QCOW2_CLUSTER_COMPRESSED: /* Compressed clusters don't have QCOW_OFLAG_COPIED */ if (l2_entry & QCOW_OFLAG_COPIED) {