mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-06 18:05:37 +00:00
mirror: Fail gracefully for source == target
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> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
dbfdf6cb36
commit
86fae10c64
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
.....................................................................................
|
||||
........................................................................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 85 tests
|
||||
Ran 88 tests
|
||||
|
||||
OK
|
||||
|
|
Loading…
Reference in a new issue