diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index eddc263680..36b264b114 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2383,6 +2383,13 @@ qemuBuildRBDString(virConnectPtr conn, char *secret = NULL; size_t secret_size; + if (strchr(disk->src, ':')) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("':' not allowed in RBD source volume name '%s'"), + disk->src); + return -1; + } + virBufferEscape(opt, ',', ",", "rbd:%s", disk->src); if (disk->auth.username) { virBufferEscape(opt, '\\', ":", ":id=%s", disk->auth.username); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-invalid.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-invalid.xml new file mode 100644 index 0000000000..e8d3280013 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-invalid.xml @@ -0,0 +1,37 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + + +
+ + + + + + + + + + + + + + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 98ceb83fba..579c016c28 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -160,6 +160,9 @@ static int testCompareXMLToArgvFiles(const char *xml, VIR_NETDEV_VPORT_PROFILE_OP_NO_OP))) { if (flags & FLAG_EXPECT_FAILURE) { ret = 0; + if (virTestGetDebug() > 1) + fprintf(stderr, "Got expected error: %s\n", + virGetLastErrorMessage()); virResetLastError(); } goto out; @@ -528,6 +531,8 @@ mymain(void) QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT); DO_TEST("disk-drive-network-rbd-ipv6", QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT); + DO_TEST_FAILURE("disk-drive-network-rbd-invalid", + QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT); DO_TEST("disk-drive-no-boot", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_BOOTINDEX); DO_TEST("disk-usb", NONE);