diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 7805b76808bd561785b154446c32fd94d67fc5d1..2264ccb56ff6426ff64d7514a000f764280d17ce 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -3173,24 +3173,58 @@ qemuDomainDefaultNetModel(const virDomainDef *def,
/*
- * Clear auto generated unix socket path, i.e., the one which starts with our
- * channel directory.
+ * Clear auto generated unix socket paths:
+ *
+ * libvirt 1.2.18 and older:
+ * {cfg->channelTargetDir}/{dom-name}.{target-name}
+ *
+ * libvirt 1.2.19 - 1.3.2:
+ * {cfg->channelTargetDir}/domain-{dom-name}/{target-name}
+ *
+ * libvirt 1.3.3 and newer:
+ * {cfg->channelTargetDir}/domain-{dom-id}-{short-dom-name}/{target-name}
+ *
+ * The unix socket path was stored in config XML until libvirt 1.3.0.
+ * If someone specifies the same path as we generate, they shouldn't do it.
+ *
+ * This function clears the path for migration as well, so we need to clear
+ * the path even if we are not storing it in the XML.
*/
-static void
+static int
qemuDomainChrDefDropDefaultPath(virDomainChrDefPtr chr,
virQEMUDriverPtr driver)
{
- virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+ virQEMUDriverConfigPtr cfg;
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+ char *regexp = NULL;
+ int ret = -1;
- if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
- chr->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO &&
- chr->source->type == VIR_DOMAIN_CHR_TYPE_UNIX &&
- chr->source->data.nix.path &&
- STRPREFIX(chr->source->data.nix.path, cfg->channelTargetDir)) {
- VIR_FREE(chr->source->data.nix.path);
+ if (chr->deviceType != VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL ||
+ chr->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO ||
+ chr->source->type != VIR_DOMAIN_CHR_TYPE_UNIX ||
+ !chr->source->data.nix.path) {
+ return 0;
}
+ cfg = virQEMUDriverGetConfig(driver);
+
+ virBufferEscapeRegex(&buf, "^%s", cfg->channelTargetDir);
+ virBufferAddLit(&buf, "/([^/]+\\.)|(domain-[^/]+/)");
+ virBufferEscapeRegex(&buf, "%s$", chr->target.name);
+
+ if (virBufferCheckError(&buf) < 0)
+ goto cleanup;
+
+ regexp = virBufferContentAndReset(&buf);
+
+ if (virStringMatch(chr->source->data.nix.path, regexp))
+ VIR_FREE(chr->source->data.nix.path);
+
+ ret = 0;
+ cleanup:
+ VIR_FREE(regexp);
virObjectUnref(cfg);
+ return ret;
}
@@ -3458,8 +3492,10 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
/* clear auto generated unix socket path for inactive definitions */
if ((parseFlags & VIR_DOMAIN_DEF_PARSE_INACTIVE) &&
- dev->type == VIR_DOMAIN_DEVICE_CHR)
- qemuDomainChrDefDropDefaultPath(dev->data.chr, driver);
+ dev->type == VIR_DOMAIN_DEVICE_CHR) {
+ if (qemuDomainChrDefDropDefaultPath(dev->data.chr, driver) < 0)
+ goto cleanup;
+ }
/* forbid capabilities mode hostdev in this kind of hypervisor */
if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
@@ -4245,8 +4281,10 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
}
}
- for (i = 0; i < def->nchannels; i++)
- qemuDomainChrDefDropDefaultPath(def->channels[i], driver);
+ for (i = 0; i < def->nchannels; i++) {
+ if (qemuDomainChrDefDropDefaultPath(def->channels[i], driver) < 0)
+ goto cleanup;
+ }
}
format:
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-channel-unix-source-path.xml b/tests/qemuxml2argvdata/qemuxml2argv-channel-unix-source-path.xml
new file mode 100644
index 0000000000000000000000000000000000000000..42cb3c387c249992e10055d34be5a58a74144883
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-channel-unix-source-path.xml
@@ -0,0 +1,29 @@
+
+ QEMUGuest1
+ c7a5fdbd-edaf-9455-926a-d65c16db1809
+ 219100
+ 1
+
+ hvm
+
+
+ /usr/bin/qemu-system-x86_64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-unix-source-path.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-unix-source-path.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2d8fa1e3acb834c8ee7ef780ba9e4bd3f2779c8a
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-unix-source-path.xml
@@ -0,0 +1,45 @@
+
+ QEMUGuest1
+ c7a5fdbd-edaf-9455-926a-d65c16db1809
+ 219100
+ 219100
+ 1
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu-system-x86_64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 81d810537be8e5835818a530b602e1186ad0c957..f8a607ffc481acb908e9604e8ee1522372f00f11 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -551,6 +551,8 @@ mymain(void)
DO_TEST("channel-virtio", NONE);
DO_TEST("channel-virtio-state", NONE);
+ DO_TEST_FULL("channel-unix-source-path", WHEN_INACTIVE, GIC_NONE, NONE);
+
DO_TEST("hostdev-usb-address", NONE);
DO_TEST("hostdev-pci-address", NONE);
DO_TEST("hostdev-vfio", NONE);