mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
iotests: Specify explicit backing format where sensible
There are many existing qcow2 images that specify a backing file but no format. This has been the source of CVEs in the past, but has become more prominent of a problem now that libvirt has switched to -blockdev. With older -drive, at least the probing was always done by qemu (so the only risk of a changed format between successive boots of a guest was if qemu was upgraded and probed differently). But with newer -blockdev, libvirt must specify a format; if libvirt guesses raw where the image was formatted, this results in data corruption visible to the guest; conversely, if libvirt guesses qcow2 where qemu was using raw, this can result in potential security holes, so modern libvirt instead refuses to use images without explicit backing format. The change in libvirt to reject images without explicit backing format has pointed out that a number of tools have been far too reliant on probing in the past. It's time to set a better example in our own iotests of properly setting this parameter. iotest calls to create, rebase, and convert are all impacted to some degree. It's a bit annoying that we are inconsistent on command line - while all of those accept -o backing_file=...,backing_fmt=..., the shortcuts are different: create and rebase have -b and -F, while convert has -B but no -F. (amend has no shortcuts, but the previous patch just deprecated the use of amend to change backing chains). Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <20200706203954.341758-9-eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
@@ -66,7 +66,7 @@ echo "Creating test image with backing file"
|
||||
echo
|
||||
|
||||
TEST_IMG=$TEST_IMG_SAVE
|
||||
_make_test_img -b "$TEST_IMG.base" 6G
|
||||
_make_test_img -b "$TEST_IMG.base" -F $IMGFMT 6G
|
||||
|
||||
echo "Filling test image"
|
||||
echo
|
||||
|
||||
@@ -269,7 +269,7 @@ wrote 65536/65536 bytes at offset 4295032832
|
||||
No errors were found on the image.
|
||||
Creating test image with backing file
|
||||
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
|
||||
Filling test image
|
||||
|
||||
=== IO: pattern 1
|
||||
|
||||
@@ -66,7 +66,7 @@ echo "Creating test image with backing file"
|
||||
echo
|
||||
|
||||
TEST_IMG="$TEST_IMG_SAVE.orig"
|
||||
_make_test_img -b "$TEST_IMG_SAVE.base" 6G
|
||||
_make_test_img -b "$TEST_IMG_SAVE.base" -F $IMGFMT 6G
|
||||
|
||||
echo "Filling test image"
|
||||
echo
|
||||
|
||||
@@ -269,7 +269,7 @@ wrote 65536/65536 bytes at offset 4295032832
|
||||
No errors were found on the image.
|
||||
Creating test image with backing file
|
||||
|
||||
Formatting 'TEST_DIR/t.IMGFMT.orig', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
||||
Formatting 'TEST_DIR/t.IMGFMT.orig', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
|
||||
Filling test image
|
||||
|
||||
=== IO: pattern 1
|
||||
|
||||
@@ -74,7 +74,7 @@ echo "Creating test image with backing file"
|
||||
echo
|
||||
|
||||
TEST_IMG="$TEST_IMG_SAVE.orig"
|
||||
_make_test_img -b "$TEST_IMG_SAVE.base" 6G
|
||||
_make_test_img -b "$TEST_IMG_SAVE.base" -F $IMGFMT 6G
|
||||
|
||||
echo "Filling test image"
|
||||
echo
|
||||
@@ -98,7 +98,8 @@ for backing_option in "-B " "-o backing_file="; do
|
||||
echo
|
||||
echo Testing conversion with $backing_option"$TEST_IMG.base" | _filter_testdir | _filter_imgfmt
|
||||
echo
|
||||
$QEMU_IMG convert -f $IMGFMT -O $IMGFMT $backing_option"$TEST_IMG.base" "$TEST_IMG.orig" "$TEST_IMG"
|
||||
$QEMU_IMG convert -f $IMGFMT -O $IMGFMT $backing_option"$TEST_IMG.base" \
|
||||
-o backing_fmt=$IMGFMT "$TEST_IMG.orig" "$TEST_IMG"
|
||||
|
||||
echo "Checking if backing clusters are allocated when they shouldn't"
|
||||
echo
|
||||
|
||||
@@ -269,7 +269,7 @@ wrote 65536/65536 bytes at offset 4296015872
|
||||
No errors were found on the image.
|
||||
Creating test image with backing file
|
||||
|
||||
Formatting 'TEST_DIR/t.IMGFMT.orig', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
||||
Formatting 'TEST_DIR/t.IMGFMT.orig', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
|
||||
Filling test image
|
||||
|
||||
=== IO: pattern 43
|
||||
|
||||
@@ -70,7 +70,7 @@ echo "Creating test image with backing file"
|
||||
echo
|
||||
|
||||
TEST_IMG="$TEST_IMG_SAVE"
|
||||
_make_test_img -b "$TEST_IMG.base" 6G
|
||||
_make_test_img -b "$TEST_IMG.base" -F $IMGFMT 6G
|
||||
|
||||
echo "Filling test image"
|
||||
echo
|
||||
@@ -131,7 +131,7 @@ backing="json:{'driver': '$IMGFMT',
|
||||
# Filter out newlines and collapse spaces
|
||||
backing=$(echo "$backing" | tr -d '\n' | tr -s ' ')
|
||||
|
||||
_make_test_img -b "$backing"
|
||||
_make_test_img -b "$backing" -F $IMGFMT
|
||||
|
||||
# Just write anything so committing will not be a no-op
|
||||
$QEMU_IO -c 'writev 0 64k' "$TEST_IMG" | _filter_qemu_io
|
||||
|
||||
@@ -269,7 +269,7 @@ wrote 65536/65536 bytes at offset 4295032832
|
||||
No errors were found on the image.
|
||||
Creating test image with backing file
|
||||
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
|
||||
Filling test image
|
||||
|
||||
=== IO: pattern 1
|
||||
@@ -1079,7 +1079,7 @@ No errors were found on the image.
|
||||
Testing failing commit
|
||||
|
||||
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=1048576
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=json:{'driver': 'IMGFMT',, 'file': { 'driver': 'blkdebug',, 'inject-error': [{ 'event': 'write_aio',, 'errno': 28,, 'once': true }],, 'image': { 'driver': 'file',, 'filename': 'TEST_DIR/t.IMGFMT.base' }}}
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=json:{'driver': 'IMGFMT',, 'file': { 'driver': 'blkdebug',, 'inject-error': [{ 'event': 'write_aio',, 'errno': 28,, 'once': true }],, 'image': { 'driver': 'file',, 'filename': 'TEST_DIR/t.IMGFMT.base' }}} backing_fmt=IMGFMT
|
||||
wrote 65536/65536 bytes at offset 0
|
||||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
qemu-img: Block job failed: No space left on device
|
||||
|
||||
@@ -83,7 +83,7 @@ TEST_IMG="$TEST_IMG_SAVE"
|
||||
echo "Creating COW image"
|
||||
echo
|
||||
|
||||
_make_test_img -b "$TEST_IMG.base_old" 1G
|
||||
_make_test_img -b "$TEST_IMG.base_old" -F $IMGFMT 1G
|
||||
io_pattern writev 0 $((4 * CLUSTER_SIZE)) 0 1 0x33
|
||||
io_pattern writev $((8 * CLUSTER_SIZE)) $((4 * CLUSTER_SIZE)) 0 1 0x33
|
||||
|
||||
@@ -109,7 +109,7 @@ io_pattern readv $((15 * CLUSTER_SIZE)) $CLUSTER_SIZE 0 1 0x00
|
||||
echo
|
||||
echo Rebase and test again
|
||||
echo
|
||||
$QEMU_IMG rebase -b "$TEST_IMG.base_new" "$TEST_IMG"
|
||||
$QEMU_IMG rebase -b "$TEST_IMG.base_new" -F $IMGFMT "$TEST_IMG"
|
||||
io_pattern readv $((0 * CLUSTER_SIZE)) $CLUSTER_SIZE 0 1 0x33
|
||||
io_pattern readv $((1 * CLUSTER_SIZE)) $CLUSTER_SIZE 0 1 0x33
|
||||
io_pattern readv $((2 * CLUSTER_SIZE)) $CLUSTER_SIZE 0 1 0x33
|
||||
@@ -159,7 +159,7 @@ OVERLAY="$TEST_DIR/$OVERLAY_WREL"
|
||||
|
||||
TEST_IMG=$BASE_OLD _make_test_img 1M
|
||||
TEST_IMG=$BASE_NEW _make_test_img 1M
|
||||
TEST_IMG=$OVERLAY _make_test_img -b "$BASE_OLD_OREL" 1M
|
||||
TEST_IMG=$OVERLAY _make_test_img -b "$BASE_OLD_OREL" -F $IMGFMT 1M
|
||||
|
||||
echo
|
||||
|
||||
@@ -176,11 +176,11 @@ $QEMU_IO "$BASE_NEW" \
|
||||
echo
|
||||
|
||||
pushd "$TEST_DIR" >/dev/null
|
||||
$QEMU_IMG rebase -f "$IMGFMT" -b "$BASE_NEW_OREL" "$OVERLAY_WREL"
|
||||
$QEMU_IMG rebase -f "$IMGFMT" -b "$BASE_NEW_OREL" -F $IMGFMT "$OVERLAY_WREL"
|
||||
popd >/dev/null
|
||||
|
||||
# Verify the backing path is correct
|
||||
TEST_IMG=$OVERLAY _img_info | grep '^backing file'
|
||||
TEST_IMG=$OVERLAY _img_info | grep '^backing file:'
|
||||
|
||||
echo
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ wrote 131072/131072 bytes at offset 786432
|
||||
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
Creating COW image
|
||||
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 backing_file=TEST_DIR/t.IMGFMT.base_old
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 backing_file=TEST_DIR/t.IMGFMT.base_old backing_fmt=IMGFMT
|
||||
=== IO: pattern 0x33
|
||||
wrote 262144/262144 bytes at offset 0
|
||||
256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
@@ -146,7 +146,7 @@ read 65536/65536 bytes at offset 983040
|
||||
|
||||
Formatting 'TEST_DIR/subdir/t.IMGFMT.base_old', fmt=IMGFMT size=1048576
|
||||
Formatting 'TEST_DIR/subdir/t.IMGFMT.base_new', fmt=IMGFMT size=1048576
|
||||
Formatting 'TEST_DIR/subdir/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=t.IMGFMT.base_old
|
||||
Formatting 'TEST_DIR/subdir/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=t.IMGFMT.base_old backing_fmt=IMGFMT
|
||||
|
||||
wrote 131072/131072 bytes at offset 0
|
||||
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
|
||||
@@ -76,7 +76,7 @@ echo "Creating test image with backing file"
|
||||
echo
|
||||
|
||||
TEST_IMG="$TEST_IMG_SAVE"
|
||||
_make_test_img -b "$TEST_IMG.base" $image_size
|
||||
_make_test_img -b "$TEST_IMG.base" -F $IMGFMT $image_size
|
||||
|
||||
echo "Filling test image"
|
||||
echo
|
||||
@@ -101,7 +101,7 @@ io_zero readv $(( offset + 32 * 1024 )) 512 1024 32
|
||||
_check_test_img
|
||||
|
||||
# Rebase it on top of its base image
|
||||
$QEMU_IMG rebase -b "$TEST_IMG.base" "$TEST_IMG"
|
||||
$QEMU_IMG rebase -b "$TEST_IMG.base" -F $IMGFMT "$TEST_IMG"
|
||||
|
||||
echo
|
||||
echo block-backup
|
||||
|
||||
@@ -70,7 +70,7 @@ wrote 512/512 bytes at offset 3221225984
|
||||
No errors were found on the image.
|
||||
Creating test image with backing file
|
||||
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=4294968832 backing_file=TEST_DIR/t.IMGFMT.base
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=4294968832 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
|
||||
Filling test image
|
||||
|
||||
=== IO: pattern 196
|
||||
|
||||
+19
-7
@@ -32,8 +32,12 @@ class TestSingleDrive(iotests.QMPTestCase):
|
||||
|
||||
def setUp(self):
|
||||
iotests.create_image(backing_img, TestSingleDrive.image_len)
|
||||
qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, mid_img)
|
||||
qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % mid_img, test_img)
|
||||
qemu_img('create', '-f', iotests.imgfmt,
|
||||
'-o', 'backing_file=%s' % backing_img,
|
||||
'-F', 'raw', mid_img)
|
||||
qemu_img('create', '-f', iotests.imgfmt,
|
||||
'-o', 'backing_file=%s' % mid_img,
|
||||
'-F', iotests.imgfmt, test_img)
|
||||
qemu_io('-f', 'raw', '-c', 'write -P 0x1 0 512', backing_img)
|
||||
qemu_io('-f', iotests.imgfmt, '-c', 'write -P 0x1 524288 512', mid_img)
|
||||
self.vm = iotests.VM().add_drive("blkdebug::" + test_img,
|
||||
@@ -199,7 +203,8 @@ class TestParallelOps(iotests.QMPTestCase):
|
||||
iotests.create_image(self.imgs[0], self.image_len)
|
||||
for i in range(1, self.num_imgs):
|
||||
qemu_img('create', '-f', iotests.imgfmt,
|
||||
'-o', 'backing_file=%s' % self.imgs[i-1], self.imgs[i])
|
||||
'-o', 'backing_file=%s' % self.imgs[i-1],
|
||||
'-F', 'raw' if i == 1 else iotests.imgfmt, self.imgs[i])
|
||||
|
||||
# Put data into the images we are copying data from
|
||||
odd_img_indexes = [x for x in reversed(range(self.num_imgs)) if x % 2 == 1]
|
||||
@@ -544,7 +549,8 @@ class TestQuorum(iotests.QMPTestCase):
|
||||
qemu_io('-f', iotests.imgfmt,
|
||||
'-c', 'write -P 0x55 0 1024', backing_img)
|
||||
qemu_img('create', '-f', iotests.imgfmt,
|
||||
'-o', 'backing_file=%s' % backing_img, child_img)
|
||||
'-o', 'backing_file=%s' % backing_img,
|
||||
'-F', iotests.imgfmt, child_img)
|
||||
opts.append("children.%d.file.filename=%s" % (i, child_img))
|
||||
opts.append("children.%d.node-name=node%d" % (i, i))
|
||||
|
||||
@@ -585,7 +591,9 @@ class TestSmallerBackingFile(iotests.QMPTestCase):
|
||||
|
||||
def setUp(self):
|
||||
iotests.create_image(backing_img, self.backing_len)
|
||||
qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img, str(self.image_len))
|
||||
qemu_img('create', '-f', iotests.imgfmt,
|
||||
'-o', 'backing_file=%s' % backing_img,
|
||||
'-F', 'raw', test_img, str(self.image_len))
|
||||
self.vm = iotests.VM().add_drive(test_img)
|
||||
self.vm.launch()
|
||||
|
||||
@@ -848,7 +856,9 @@ class TestStreamStop(iotests.QMPTestCase):
|
||||
def setUp(self):
|
||||
qemu_img('create', backing_img, str(TestStreamStop.image_len))
|
||||
qemu_io('-f', 'raw', '-c', 'write -P 0x1 0 32M', backing_img)
|
||||
qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img)
|
||||
qemu_img('create', '-f', iotests.imgfmt,
|
||||
'-o', 'backing_file=%s' % backing_img,
|
||||
'-F', 'raw', test_img)
|
||||
qemu_io('-f', iotests.imgfmt, '-c', 'write -P 0x1 32M 32M', test_img)
|
||||
self.vm = iotests.VM().add_drive("blkdebug::" + test_img)
|
||||
self.vm.launch()
|
||||
@@ -879,7 +889,9 @@ class TestSetSpeed(iotests.QMPTestCase):
|
||||
def setUp(self):
|
||||
qemu_img('create', backing_img, str(TestSetSpeed.image_len))
|
||||
qemu_io('-f', 'raw', '-c', 'write -P 0x1 0 32M', backing_img)
|
||||
qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img)
|
||||
qemu_img('create', '-f', iotests.imgfmt,
|
||||
'-o', 'backing_file=%s' % backing_img,
|
||||
'-F', 'raw', test_img)
|
||||
qemu_io('-f', iotests.imgfmt, '-c', 'write -P 0x1 32M 32M', test_img)
|
||||
self.vm = iotests.VM().add_drive('blkdebug::' + test_img)
|
||||
self.vm.launch()
|
||||
|
||||
@@ -58,7 +58,7 @@ $QEMU_IO -c "write -P 0x55 0 1M" "$TEST_IMG" | _filter_qemu_io
|
||||
|
||||
TEST_IMG="$TEST_IMG_SAVE"
|
||||
|
||||
_make_test_img -b "$TEST_IMG.base" 6G
|
||||
_make_test_img -b "$TEST_IMG.base" -F $IMGFMT 6G
|
||||
|
||||
echo
|
||||
echo "== zero write with backing file =="
|
||||
|
||||
@@ -4,7 +4,7 @@ QA output created by 034
|
||||
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
|
||||
wrote 1048576/1048576 bytes at offset 0
|
||||
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
|
||||
|
||||
== zero write with backing file ==
|
||||
wrote 196608/196608 bytes at offset 65536
|
||||
|
||||
@@ -74,7 +74,7 @@ backing_io 0 256 write | $QEMU_IO "$TEST_IMG" | _filter_qemu_io
|
||||
|
||||
TEST_IMG="$TEST_IMG_SAVE"
|
||||
|
||||
_make_test_img -b "$TEST_IMG.base" 6G
|
||||
_make_test_img -b "$TEST_IMG.base" -F $IMGFMT 6G
|
||||
|
||||
echo
|
||||
echo "== COW in a single cluster =="
|
||||
|
||||
@@ -514,7 +514,7 @@ wrote 512/512 bytes at offset 130048
|
||||
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
wrote 512/512 bytes at offset 130560
|
||||
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
|
||||
|
||||
== COW in a single cluster ==
|
||||
wrote 2048/2048 bytes at offset 0
|
||||
|
||||
@@ -71,7 +71,7 @@ backing_io 0 256 write | $QEMU_IO "$TEST_IMG" | _filter_qemu_io
|
||||
|
||||
TEST_IMG="$TEST_IMG_SAVE"
|
||||
|
||||
_make_test_img -b "$TEST_IMG.base" 6G
|
||||
_make_test_img -b "$TEST_IMG.base" -F $IMGFMT 6G
|
||||
|
||||
echo
|
||||
echo "== Some concurrent requests touching the same cluster =="
|
||||
|
||||
@@ -514,7 +514,7 @@ wrote 65536/65536 bytes at offset 16646144
|
||||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
wrote 65536/65536 bytes at offset 16711680
|
||||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
|
||||
|
||||
== Some concurrent requests touching the same cluster ==
|
||||
wrote 65536/65536 bytes at offset XXX
|
||||
|
||||
@@ -133,7 +133,8 @@ echo "== Committing to a backing file with lazy_refcounts=on =="
|
||||
|
||||
TEST_IMG="$TEST_IMG".base _make_test_img -o "compat=1.1,lazy_refcounts=on" $size
|
||||
|
||||
_make_test_img -o "compat=1.1,lazy_refcounts=on,backing_file=$TEST_IMG.base" $size
|
||||
_make_test_img -o "compat=1.1,lazy_refcounts=on,backing_file=$TEST_IMG.base" \
|
||||
-F $IMGFMT $size
|
||||
|
||||
$QEMU_IO -c "write 0 512" "$TEST_IMG" | _filter_qemu_io
|
||||
$QEMU_IMG commit "$TEST_IMG"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user