On Fri, May 12, 2017 at 04:26:35PM +0200, Martin Kletzander wrote:
> On Fri, May 12, 2017 at 02:57:56PM +0200, Pavel Hrdina wrote:
> >Currently we consider all UNIX paths with specific prefix as generated
> >by libvirt, but that's a wrong assumption. Let's make the detection
> >better by actually checking whether the whole path matches one of the
> >paths that we generate or generated in the past.
> >
> >The UNIX path isn't stored in config XML since libvirt-1.3.0.
> >
>
> 1.3.1, I believe.
>
> >Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1446980
> >
> >Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
> >---
> >
> >changes in v2:
> > - dropped the magic to split the path into 3 parts and use only one
> > regexp to match the path
> >
> > src/qemu/qemu_domain.c | 51 ++++++++++++++++++----
> > .../qemuxml2argv-channel-unix-gen-path1.xml | 17 ++++++++
> > .../qemuxml2argv-channel-unix-gen-path2.xml | 17 ++++++++
> > .../qemuxml2argv-channel-unix-gen-path3.xml | 17 ++++++++
> > .../qemuxml2argv-channel-unix-user-path.xml | 17 ++++++++
> > .../qemuxml2xmlout-channel-unix-gen-path1.xml | 32 ++++++++++++++
> > .../qemuxml2xmlout-channel-unix-gen-path2.xml | 32 ++++++++++++++
> > .../qemuxml2xmlout-channel-unix-gen-path3.xml | 32 ++++++++++++++
> > .../qemuxml2xmlout-channel-unix-user-path.xml | 33 ++++++++++++++
> > tests/qemuxml2xmltest.c | 5 +++
> > 10 files changed, 244 insertions(+), 9 deletions(-)
> > create mode 100644
tests/qemuxml2argvdata/qemuxml2argv-channel-unix-gen-path1.xml
> > create mode 100644
tests/qemuxml2argvdata/qemuxml2argv-channel-unix-gen-path2.xml
> > create mode 100644
tests/qemuxml2argvdata/qemuxml2argv-channel-unix-gen-path3.xml
> > create mode 100644
tests/qemuxml2argvdata/qemuxml2argv-channel-unix-user-path.xml
> > create mode 100644
tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-unix-gen-path1.xml
> > create mode 100644
tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-unix-gen-path2.xml
> > create mode 100644
tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-unix-gen-path3.xml
> > create mode 100644
tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-unix-user-path.xml
> >
>
> Just have one file that tests it all.
>
> >diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> >index cc02c801e1..00e37d3428 100644
> >--- a/src/qemu/qemu_domain.c
> >+++ b/src/qemu/qemu_domain.c
> >@@ -3154,24 +3154,57 @@ 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 event if we are not storing it in the XML.
> > */
> >-static void
> >+static int
>
> This ^^ is not reflected anywhere. It's a pity that such function (that
> just conditionally frees something) can fail.
I've somehow lost the change to the callers to handle the failure, sigh.
>
> > qemuDomainChrDefDropDefaultPath(virDomainChrDefPtr chr,
> > virQEMUDriverPtr driver)
> > {
> > virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
> >+ 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))
{
> >+ 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) {
>
> This would be more readable if you postponed the initialization of @cfg
> and just return 0 from this. Optionally break this into multiple
> conditions.
>
> >+ ret = 0;
> >+ goto cleanup;
> >+ }
> >+
> >+ virBufferEscapeRegex(&buf, "^%s", cfg->channelTargetDir);
> >+ virBufferAddLit(&buf, "/([^/]+\\.)|(domain-[^/]+/)");
> >+ virBufferEscapeRegex(&buf, "%s$", chr->target.name);
> >+
> >+ if (virBufferCheckError(&buf) < 0)
> >+ goto cleanup;
> >+
>
> No need to do this ^^, [1]
>
> >+ regexp = virBufferContentAndReset(&buf);
> >+
>
> [1] Just do this:
>
> if ((regexp = virBufferContentAndReset(&buf)) < 0)
> goto cleanup;
>
> or similar.
It's not equivalent, the virBufferCheckError() also reports an error
which I want to do. I'll fix the callers to check the return value
of qemuDomainChrDefDropDefaultPath().
Yep, my bad, sorry. Thanks.