Keep track of the refcount table in the metadata list to protect it against accidental modifications.
Signed-off-by: Max Reitz <mre...@redhat.com> Reviewed-by: Eric Blake <ebl...@redhat.com> --- block/qcow2-refcount.c | 18 ++++++++++++++++++ block/qcow2.c | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c index f47260b..439835d 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -585,6 +585,14 @@ static int alloc_refcount_block(BlockDriverState *bs, s->refcount_table_size = table_size; s->refcount_table_offset = table_offset; + qcow2_metadata_list_remove(bs, old_table_offset, + size_to_clusters(s, old_table_size * + sizeof(uint64_t)), + QCOW2_OL_REFCOUNT_TABLE); + + qcow2_metadata_list_enter(bs, table_offset, table_clusters, + QCOW2_OL_REFCOUNT_TABLE); + /* Free old table. */ qcow2_free_clusters(bs, old_table_offset, old_table_size * sizeof(uint64_t), QCOW2_DISCARD_OTHER); @@ -2161,6 +2169,16 @@ write_refblocks: goto fail; } + qcow2_metadata_list_remove(bs, s->refcount_table_offset, + size_to_clusters(s, s->refcount_table_size + * sizeof(uint64_t)), + QCOW2_OL_REFCOUNT_TABLE); + + qcow2_metadata_list_enter(bs, reftable_offset, + size_to_clusters(s, reftable_size * + sizeof(uint64_t)), + QCOW2_OL_REFCOUNT_TABLE); + for (refblock_index = 0; refblock_index < reftable_size; refblock_index++) { be64_to_cpus(&on_disk_reftable[refblock_index]); } diff --git a/block/qcow2.c b/block/qcow2.c index fc53b34..e9dbd72 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -784,6 +784,10 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags, error_setg(errp, "Invalid reference count table offset"); goto fail; } + qcow2_metadata_list_enter(bs, s->refcount_table_offset, + size_to_clusters(s, s->refcount_table_size * + sizeof(uint64_t)), + QCOW2_OL_REFCOUNT_TABLE); /* Snapshot table offset/length */ if (header.nb_snapshots > QCOW_MAX_SNAPSHOTS) { -- 2.3.7