Keep track of the refcount table in the metadata list to protect it against accidental modifications.
Signed-off-by: Max Reitz <mre...@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 9afdb40..97c28da 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -433,6 +433,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); @@ -1948,6 +1956,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 19ac2df..1644421 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -779,6 +779,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) { -- 1.9.3