[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 11/16] qcow2: Keep track of the snapshot table length
From: |
Max Reitz |
Subject: |
[PATCH v3 11/16] qcow2: Keep track of the snapshot table length |
Date: |
Fri, 11 Oct 2019 17:28:09 +0200 |
When repairing the snapshot table, we truncate entries that have too
much extra data. This frees up space that we do not have to count
towards the snapshot table size.
Signed-off-by: Max Reitz <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
block/qcow2-snapshot.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c
index 53dc1635ec..582eb3386a 100644
--- a/block/qcow2-snapshot.c
+++ b/block/qcow2-snapshot.c
@@ -68,6 +68,7 @@ static int qcow2_do_read_snapshots(BlockDriverState *bs, bool
repair,
QCowSnapshot *sn;
int i, id_str_size, name_size;
int64_t offset;
+ uint64_t table_length = 0;
int ret;
if (!s->nb_snapshots) {
@@ -82,6 +83,8 @@ static int qcow2_do_read_snapshots(BlockDriverState *bs, bool
repair,
for(i = 0; i < s->nb_snapshots; i++) {
bool truncate_unknown_extra_data = false;
+ table_length = ROUND_UP(table_length, 8);
+
/* Read statically sized part of the snapshot header */
offset = ROUND_UP(offset, 8);
ret = bdrv_pread(bs->file, offset, &h, sizeof(h));
@@ -184,7 +187,16 @@ static int qcow2_do_read_snapshots(BlockDriverState *bs,
bool repair,
offset += name_size;
sn->name[name_size] = '\0';
- if (offset - s->snapshots_offset > QCOW_MAX_SNAPSHOTS_SIZE) {
+ /* Note that the extra data may have been truncated */
+ table_length += sizeof(h) + sn->extra_data_size + id_str_size +
+ name_size;
+ if (!repair) {
+ assert(table_length == offset - s->snapshots_offset);
+ }
+
+ if (table_length > QCOW_MAX_SNAPSHOTS_SIZE ||
+ offset - s->snapshots_offset > INT_MAX)
+ {
ret = -EFBIG;
error_setg(errp, "Snapshot table is too big");
goto fail;
--
2.21.0
- [PATCH v3 05/16] qcow2: Make qcow2_write_snapshots() public, (continued)
[PATCH v3 06/16] qcow2: Put qcow2_upgrade() into its own function, Max Reitz, 2019/10/11
[PATCH v3 08/16] qcow2: Separate qcow2_check_read_snapshot_table(), Max Reitz, 2019/10/11
[PATCH v3 09/16] qcow2: Add qcow2_check_fix_snapshot_table(), Max Reitz, 2019/10/11
[PATCH v3 10/16] qcow2: Fix broken snapshot table entries, Max Reitz, 2019/10/11
[PATCH v3 11/16] qcow2: Keep track of the snapshot table length,
Max Reitz <=
[PATCH v3 12/16] qcow2: Fix overly long snapshot tables, Max Reitz, 2019/10/11
[PATCH v3 13/16] qcow2: Repair snapshot table with too many entries, Max Reitz, 2019/10/11
[PATCH v3 14/16] qcow2: Fix v3 snapshot table entry compliancy, Max Reitz, 2019/10/11
[PATCH v3 15/16] iotests: Add peek_file* functions, Max Reitz, 2019/10/11
[PATCH v3 16/16] iotests: Test qcow2's snapshot table handling, Max Reitz, 2019/10/11
Re: [PATCH v3 00/16] qcow2: Let check -r all repair some snapshot bits, Max Reitz, 2019/10/28