From nobody Fri May 16 07:53:22 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1494602507829590.6173129666737; Fri, 12 May 2017 08:21:47 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3FABF64D86; Fri, 12 May 2017 15:21:35 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9CE245C8B1; Fri, 12 May 2017 15:21:34 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 4991C5EC63; Fri, 12 May 2017 15:21:31 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v4CFHfo5028716 for ; Fri, 12 May 2017 11:17:41 -0400 Received: by smtp.corp.redhat.com (Postfix) id C4A507F38D; Fri, 12 May 2017 15:17:41 +0000 (UTC) Received: from antique-work.brq.redhat.com (dhcp129-230.brq.redhat.com [10.34.129.230]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4BF107F3AE for ; Fri, 12 May 2017 15:17:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3FABF64D86 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 3FABF64D86 From: Pavel Hrdina To: libvir-list@redhat.com Date: Fri, 12 May 2017 17:17:33 +0200 Message-Id: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v3] qemu: improve detection of UNIX path generated by libvirt X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 12 May 2017 15:21:44 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" 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.1. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=3D1446980 Signed-off-by: Pavel Hrdina --- src/qemu/qemu_domain.c | 66 +++++++++++++++++-= ---- .../qemuxml2argv-channel-unix-source-path.xml | 29 ++++++++++ .../qemuxml2xmlout-channel-unix-source-path.xml | 45 +++++++++++++++ tests/qemuxml2xmltest.c | 2 + 4 files changed, 128 insertions(+), 14 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-channel-unix-source= -path.xml create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-unix-so= urce-path.xml diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index cc02c801e1..8b7d1b5e41 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3154,24 +3154,58 @@ qemuDomainDefaultNetModel(const virDomainDef *def, =20 =20 /* - * 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-na= me} + * + * 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 =3D virQEMUDriverGetConfig(driver); + virQEMUDriverConfigPtr cfg; + virBuffer buf =3D VIR_BUFFER_INITIALIZER; + char *regexp =3D NULL; + int ret =3D -1; =20 - if (chr->deviceType =3D=3D VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL && - chr->targetType =3D=3D VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO && - chr->source->type =3D=3D VIR_DOMAIN_CHR_TYPE_UNIX && - chr->source->data.nix.path && - STRPREFIX(chr->source->data.nix.path, cfg->channelTargetDir)) { + if (chr->deviceType !=3D VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL || + chr->targetType !=3D VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO || + chr->source->type !=3D VIR_DOMAIN_CHR_TYPE_UNIX || + !chr->source->data.nix.path) { + return 0; + } + + cfg =3D virQEMUDriverGetConfig(driver); + + virBufferEscapeRegex(&buf, "^%s", cfg->channelTargetDir); + virBufferAddLit(&buf, "/([^/]+\\.)|(domain-[^/]+/)"); + virBufferEscapeRegex(&buf, "%s$", chr->target.name); + + if (virBufferCheckError(&buf) < 0) + goto cleanup; + + regexp =3D virBufferContentAndReset(&buf); + + if (virStringMatch(chr->source->data.nix.path, regexp)) VIR_FREE(chr->source->data.nix.path); - } =20 + ret =3D 0; + cleanup: + VIR_FREE(regexp); virObjectUnref(cfg); + return ret; } =20 =20 @@ -3439,8 +3473,10 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr d= ev, =20 /* clear auto generated unix socket path for inactive definitions */ if ((parseFlags & VIR_DOMAIN_DEF_PARSE_INACTIVE) && - dev->type =3D=3D VIR_DOMAIN_DEVICE_CHR) - qemuDomainChrDefDropDefaultPath(dev->data.chr, driver); + dev->type =3D=3D VIR_DOMAIN_DEVICE_CHR) { + if (qemuDomainChrDefDropDefaultPath(dev->data.chr, driver) < 0) + goto cleanup; + } =20 /* forbid capabilities mode hostdev in this kind of hypervisor */ if (dev->type =3D=3D VIR_DOMAIN_DEVICE_HOSTDEV && @@ -4226,8 +4262,10 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, } } =20 - for (i =3D 0; i < def->nchannels; i++) - qemuDomainChrDefDropDefaultPath(def->channels[i], driver); + for (i =3D 0; i < def->nchannels; i++) { + if (qemuDomainChrDefDropDefaultPath(def->channels[i], driver) = < 0) + goto cleanup; + } } =20 format: diff --git a/tests/qemuxml2argvdata/qemuxml2argv-channel-unix-source-path.x= ml b/tests/qemuxml2argvdata/qemuxml2argv-channel-unix-source-path.xml new file mode 100644 index 0000000000..42cb3c387c --- /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-pa= th.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-unix-source-path.x= ml new file mode 100644 index 0000000000..2d8fa1e3ac --- /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 2dccde746e..6e3544e4b7 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); =20 + 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); --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list