[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH 6/7] qcow2: Check snapshot L1 table in qcow2_snapsho
From: |
Alberto Garcia |
Subject: |
[Qemu-block] [PATCH 6/7] qcow2: Check snapshot L1 table in qcow2_snapshot_delete() |
Date: |
Thu, 1 Mar 2018 18:27:12 +0200 |
This function deletes a snapshot from disk, removing its entry from
the snapshot table, freeing its L1 table and decreasing the refcounts
of all clusters.
The L1 table offset and size are however not validated. If we use
invalid values in this function we'll probably corrupt the image even
more, so we should return an error instead.
We now have a function to take care of this, so let's use it.
Signed-off-by: Alberto Garcia <address@hidden>
---
block/qcow2-snapshot.c | 7 +++++++
tests/qemu-iotests/080 | 2 ++
tests/qemu-iotests/080.out | 2 ++
3 files changed, 11 insertions(+)
diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c
index f1be5506a2..727a3d79de 100644
--- a/block/qcow2-snapshot.c
+++ b/block/qcow2-snapshot.c
@@ -608,6 +608,13 @@ int qcow2_snapshot_delete(BlockDriverState *bs,
}
sn = s->snapshots[snapshot_index];
+ ret = qcow2_validate_table(bs, sn.l1_table_offset, sn.l1_size,
+ sizeof(uint64_t), QCOW_MAX_L1_SIZE,
+ "Snapshot L1 table", errp);
+ if (ret < 0) {
+ return ret;
+ }
+
/* Remove it from the snapshot list */
memmove(s->snapshots + snapshot_index,
s->snapshots + snapshot_index + 1,
diff --git a/tests/qemu-iotests/080 b/tests/qemu-iotests/080
index 538857310f..f8e7d6f4df 100755
--- a/tests/qemu-iotests/080
+++ b/tests/qemu-iotests/080
@@ -181,6 +181,7 @@ poke_file "$TEST_IMG" "$offset_snap1_l1_offset"
"\x00\x00\x00\x00\x00\x40\x02\x0
{ $QEMU_IO -c "open -o overlap-check.inactive-l2=on $TEST_IMG" \
-c 'write 0 4k'; } 2>&1 | _filter_qemu_io | _filter_testdir
{ $QEMU_IMG snapshot -a test $TEST_IMG; } 2>&1 | _filter_testdir
+{ $QEMU_IMG snapshot -d test $TEST_IMG; } 2>&1 | _filter_testdir
echo
echo "== Invalid snapshot L1 table size =="
@@ -193,6 +194,7 @@ poke_file "$TEST_IMG" "$offset_snap1_l1_size"
"\x10\x00\x00\x00"
{ $QEMU_IO -c "open -o overlap-check.inactive-l2=on $TEST_IMG" \
-c 'write 0 4k'; } 2>&1 | _filter_qemu_io | _filter_testdir
{ $QEMU_IMG snapshot -a test $TEST_IMG; } 2>&1 | _filter_testdir
+{ $QEMU_IMG snapshot -d test $TEST_IMG; } 2>&1 | _filter_testdir
# success, all done
echo "*** done"
diff --git a/tests/qemu-iotests/080.out b/tests/qemu-iotests/080.out
index 35c768aff3..f16fd59053 100644
--- a/tests/qemu-iotests/080.out
+++ b/tests/qemu-iotests/080.out
@@ -68,6 +68,7 @@ qemu-img: Error while amending options: Invalid argument
Failed to flush the refcount block cache: Invalid argument
write failed: Invalid argument
qemu-img: Could not apply snapshot 'test': Failed to load snapshot: Invalid
argument
+qemu-img: Could not delete snapshot 'test': Snapshot L1 table offset invalid
== Invalid snapshot L1 table size ==
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
@@ -78,4 +79,5 @@ qemu-img: Error while amending options: File too large
Failed to flush the refcount block cache: File too large
write failed: File too large
qemu-img: Could not apply snapshot 'test': Failed to load snapshot: File too
large
+qemu-img: Could not delete snapshot 'test': Snapshot L1 table too large
*** done
--
2.11.0
- [Qemu-block] [PATCH 0/7] Add checks for corruption in the snapshot table, Alberto Garcia, 2018/03/01
- [Qemu-block] [PATCH 7/7] qcow2: Make qemu-img check detect corrupted L1 tables in snapshots, Alberto Garcia, 2018/03/01
- [Qemu-block] [PATCH 6/7] qcow2: Check snapshot L1 table in qcow2_snapshot_delete(),
Alberto Garcia <=
- [Qemu-block] [PATCH 4/7] qcow2: Check snapshot L1 tables in qcow2_check_metadata_overlap(), Alberto Garcia, 2018/03/01
- [Qemu-block] [PATCH 2/7] qcow2: Check L1 table offset in qcow2_snapshot_load_tmp(), Alberto Garcia, 2018/03/01
- [Qemu-block] [PATCH 5/7] qcow2: Check snapshot L1 table in qcow2_snapshot_goto(), Alberto Garcia, 2018/03/01
- [Qemu-block] [PATCH 1/7] qcow2: Generalize validate_table_offset() into qcow2_validate_table(), Alberto Garcia, 2018/03/01
- [Qemu-block] [PATCH 3/7] qcow2: Check L1 table parameters in qcow2_expand_zero_clusters(), Alberto Garcia, 2018/03/01