* [Qemu-devel] [PATCH] mirror: Fail gracefully for source == target
@ 2018-08-14 9:58 Kevin Wolf
2018-08-14 12:57 ` Eric Blake
0 siblings, 1 reply; 2+ messages in thread
From: Kevin Wolf @ 2018-08-14 9:58 UTC (permalink / raw)
To: qemu-block; +Cc: kwolf, qemu-devel, qemu-stable
blockdev-mirror with the same node for source and target segfaults
today: A node is in its own backing chain, so mirror_start_job() decides
that this is an active commit. When adding the intermediate nodes with
block_job_add_bdrv(), it starts the iteration through the subchain with
the backing file of source, though, so it never reaches target and
instead runs into NULL at the base.
While we could fix that by starting with source itself, there is no
point in allowing mirroring a node into itself and I wouldn't be
surprised if this caused more problems later.
So just check for this scenario and error out.
Cc: qemu-stable@nongnu.org
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/mirror.c | 5 +++++
tests/qemu-iotests/041 | 6 ++++++
tests/qemu-iotests/041.out | 4 ++--
3 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
index b48c3f8cf5..dd5ca02b09 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -1499,6 +1499,11 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs,
buf_size = DEFAULT_MIRROR_BUF_SIZE;
}
+ if (bs == target) {
+ error_setg(errp, "Can't mirror node into itself");
+ return;
+ }
+
/* In the case of active commit, add dummy driver to provide consistent
* reads on the top, while disabling it in the intermediate nodes, and make
* the backing chain writable. */
diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041
index c20ac7da87..9336ab6ff5 100755
--- a/tests/qemu-iotests/041
+++ b/tests/qemu-iotests/041
@@ -234,6 +234,12 @@ class TestSingleBlockdev(TestSingleDrive):
result = self.vm.qmp("blockdev-add", **args)
self.assert_qmp(result, 'return', {})
+ def test_mirror_to_self(self):
+ result = self.vm.qmp(self.qmp_cmd, job_id='job0',
+ device=self.qmp_target, sync='full',
+ target=self.qmp_target)
+ self.assert_qmp(result, 'error/class', 'GenericError')
+
test_large_cluster = None
test_image_not_found = None
test_small_buffer2 = None
diff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out
index c28b392b87..e071d0b261 100644
--- a/tests/qemu-iotests/041.out
+++ b/tests/qemu-iotests/041.out
@@ -1,5 +1,5 @@
-.....................................................................................
+........................................................................................
----------------------------------------------------------------------
-Ran 85 tests
+Ran 88 tests
OK
--
2.13.6
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH] mirror: Fail gracefully for source == target
2018-08-14 9:58 [Qemu-devel] [PATCH] mirror: Fail gracefully for source == target Kevin Wolf
@ 2018-08-14 12:57 ` Eric Blake
0 siblings, 0 replies; 2+ messages in thread
From: Eric Blake @ 2018-08-14 12:57 UTC (permalink / raw)
To: Kevin Wolf, qemu-block; +Cc: qemu-devel, qemu-stable
On 08/14/2018 04:58 AM, Kevin Wolf wrote:
> blockdev-mirror with the same node for source and target segfaults
> today: A node is in its own backing chain, so mirror_start_job() decides
> that this is an active commit. When adding the intermediate nodes with
> block_job_add_bdrv(), it starts the iteration through the subchain with
> the backing file of source, though, so it never reaches target and
> instead runs into NULL at the base.
>
> While we could fix that by starting with source itself, there is no
> point in allowing mirroring a node into itself and I wouldn't be
> surprised if this caused more problems later.
>
> So just check for this scenario and error out.
>
> Cc: qemu-stable@nongnu.org
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> block/mirror.c | 5 +++++
> tests/qemu-iotests/041 | 6 ++++++
> tests/qemu-iotests/041.out | 4 ++--
> 3 files changed, 13 insertions(+), 2 deletions(-)
>
Reviewed-by: Eric Blake <eblake@redhat.com>
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-08-14 12:57 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-08-14 9:58 [Qemu-devel] [PATCH] mirror: Fail gracefully for source == target Kevin Wolf
2018-08-14 12:57 ` Eric Blake
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).