- qemu: Generate shorter channel target paths

- qemu: Move channelTargetDir into stateDir
- qemu_domain: Drop unused variables from qemuDomainChrDefDropDefaultPath()
This commit is contained in:
eabdullin 2023-09-13 11:22:47 +03:00
parent c10bd8cbd9
commit 0a1fe0c265
4 changed files with 503 additions and 3 deletions

View File

@ -0,0 +1,232 @@
From d3759d3674ab9453e5fb5a27ab6c28b8ff8d5569 Mon Sep 17 00:00:00 2001
From: Michal Privoznik <mprivozn@redhat.com>
Date: Tue, 18 Apr 2023 17:34:12 +0200
Subject: [PATCH] qemu: Generate shorter channel target paths
A <channel/> device is basically an UNIX socket into guest.
Whatever is sent from the host, appears in the guest and vice
versa. But because of that, the length of the path to the socket
is important (underscored by fact that we derive the path from
domain short name). But there are still cases where we might not
fit into UNIX_PATH_MAX limit (usually 108 characters), because
the path is derived also from other variables, e.g.
XDG_CONFIG_HOME for session domains.
There are two components though, that are needless: "/target/"
and "domain-" prefix. Drop them. This is safe to do, because
running domains have their path saved in status XML and even
though paths are dropped on migration, they are not part of guest
ABI and thus we are free to change them.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
---
libvirt.spec.in | 1 -
src/qemu/qemu_conf.c | 6 +++---
src/qemu/qemu_domain.c | 15 +++++++++------
.../qemuhotplug-qemu-agent-detach.xml | 2 +-
.../qemuhotplug-base+qemu-agent-detach.xml | 2 +-
.../qemuhotplug-base+qemu-agent.xml | 2 +-
.../qemuhotplug-base-live+qemu-agent-detach.xml | 2 +-
.../qemuhotplug-base-live+qemu-agent.xml | 2 +-
.../qemuxml2argvdata/channel-unix-source-path.xml | 4 ++++
.../channel-unix-source-path-active.xml | 5 +++++
.../channel-unix-source-path-inactive.xml | 4 ++++
tests/testutilsqemu.c | 2 +-
12 files changed, 31 insertions(+), 16 deletions(-)
diff --git a/libvirt.spec.in b/libvirt.spec.in
index 17d5f5ff4a0..3b179d1fd98 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -2136,7 +2136,6 @@ exit 0
%ghost %dir %{_rundir}/libvirt/qemu/swtpm/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/
-%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/target/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/checkpoint/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/dump/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/nvram/
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index bd984448a39..532fe36be36 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -146,7 +146,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir);
cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir);
cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir);
- cfg->channelTargetDir = g_strdup_printf("%s/channel/target", cfg->libDir);
+ cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir);
cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir);
} else if (privileged) {
@@ -168,7 +168,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir);
cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir);
cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir);
- cfg->channelTargetDir = g_strdup_printf("%s/channel/target", cfg->libDir);
+ cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir);
cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir);
cfg->swtpmStorageDir = g_strdup_printf("%s/lib/libvirt/swtpm",
@@ -202,7 +202,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
cfg->checkpointDir = g_strdup_printf("%s/qemu/checkpoint",
cfg->configBaseDir);
cfg->autoDumpPath = g_strdup_printf("%s/qemu/dump", cfg->configBaseDir);
- cfg->channelTargetDir = g_strdup_printf("%s/qemu/channel/target",
+ cfg->channelTargetDir = g_strdup_printf("%s/qemu/channel",
cfg->configBaseDir);
cfg->nvramDir = g_strdup_printf("%s/qemu/nvram", cfg->configBaseDir);
cfg->memoryBackingDir = g_strdup_printf("%s/qemu/ram", cfg->configBaseDir);
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 029238a9d73..224350dabc3 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1733,7 +1733,7 @@ qemuDomainSetPrivatePaths(virQEMUDriver *driver,
priv->libDir = g_strdup_printf("%s/domain-%s", cfg->libDir, domname);
if (!priv->channelTargetDir)
- priv->channelTargetDir = g_strdup_printf("%s/domain-%s",
+ priv->channelTargetDir = g_strdup_printf("%s/%s",
cfg->channelTargetDir, domname);
return 0;
@@ -5157,13 +5157,16 @@ qemuDomainDefaultNetModel(const virDomainDef *def,
* Clear auto generated unix socket paths:
*
* libvirt 1.2.18 and older:
- * {cfg->channelTargetDir}/{dom-name}.{target-name}
+ * {cfg->channelTargetDir}/target/{dom-name}.{target-name}
*
* libvirt 1.2.19 - 1.3.2:
- * {cfg->channelTargetDir}/domain-{dom-name}/{target-name}
+ * {cfg->channelTargetDir}/target/domain-{dom-name}/{target-name}
+ *
+ * libvirt 1.3.3 - 9.7.0:
+ * {cfg->channelTargetDir}/target/domain-{dom-id}-{short-dom-name}/{target-name}
*
- * libvirt 1.3.3 and newer:
- * {cfg->channelTargetDir}/domain-{dom-id}-{short-dom-name}/{target-name}
+ * libvirt 9.7.0 and newer:
+ * {cfg->channelTargetDir}/{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.
@@ -5189,7 +5192,7 @@ qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr,
cfg = virQEMUDriverGetConfig(driver);
virBufferEscapeRegex(&buf, "^%s", cfg->channelTargetDir);
- virBufferAddLit(&buf, "/([^/]+\\.)|(domain-[^/]+/)");
+ virBufferAddLit(&buf, "/(target/)?([^/]+\\.)|(domain-[^/]+/)|([0-9]+-[^/]+/)");
virBufferEscapeRegex(&buf, "%s$", chr->target.name);
regexp = virBufferContentAndReset(&buf);
diff --git a/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml b/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml
index 0c3c70a78e8..7871de59c40 100644
--- a/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml
+++ b/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml
@@ -1,5 +1,5 @@
<channel type='unix'>
- <source mode='bind' path='/tmp/channel/domain-7-hotplug/org.qemu.guest_agent.0'/>
+ <source mode='bind' path='/tmp/channel/7-hotplug/org.qemu.guest_agent.0'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent-detach.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent-detach.xml
index 728af3391e3..bf2afb67d9c 100644
--- a/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent-detach.xml
+++ b/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent-detach.xml
@@ -39,7 +39,7 @@
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</controller>
<channel type='unix'>
- <source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-7-hotplug/org.qemu.guest_agent.0'/>
+ <source mode='bind' path='/tmp/channel/7-hotplug/org.qemu.guest_agent.0'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent.xml
index 728af3391e3..31917cee92c 100644
--- a/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent.xml
+++ b/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent.xml
@@ -39,7 +39,7 @@
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</controller>
<channel type='unix'>
- <source mode='bind' path='/tmp/channel/domain-7-hotplug/org.qemu.guest_agent.0'/>
+ <source mode='bind' path='/var/lib/libvirt/qemu/channel/domain-7-hotplug/org.qemu.guest_agent.0'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent-detach.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent-detach.xml
index 728af3391e3..bf2afb67d9c 100644
--- a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent-detach.xml
+++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent-detach.xml
@@ -39,7 +39,7 @@
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</controller>
<channel type='unix'>
- <source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-7-hotplug/org.qemu.guest_agent.0'/>
+ <source mode='bind' path='/tmp/channel/7-hotplug/org.qemu.guest_agent.0'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.xml
index 0e4c3907bfb..00191a9cb8b 100644
--- a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.xml
+++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.xml
@@ -39,7 +39,7 @@
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</controller>
<channel type='unix'>
- <source mode='bind' path='/tmp/channel/domain-7-hotplug/org.qemu.guest_agent.0'/>
+ <source mode='bind' path='/tmp/channel/7-hotplug/org.qemu.guest_agent.0'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
diff --git a/tests/qemuxml2argvdata/channel-unix-source-path.xml b/tests/qemuxml2argvdata/channel-unix-source-path.xml
index f24c636147e..db0e99c3d12 100644
--- a/tests/qemuxml2argvdata/channel-unix-source-path.xml
+++ b/tests/qemuxml2argvdata/channel-unix-source-path.xml
@@ -24,6 +24,10 @@
<source mode='bind' path='/tmp/channel/QEMUGuest1/org.qemu.guest_agent.3'/>
<target type='virtio' name='org.qemu.guest_agent.3'/>
</channel>
+ <channel type='unix'>
+ <source mode='bind' path='/var/lib/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.4'/>
+ <target type='virtio' name='org.qemu.guest_agent.4'/>
+ </channel>
<memballoon model='none'/>
</devices>
</domain>
diff --git a/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml b/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
index 0d6a0295f82..68835ceb151 100644
--- a/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
+++ b/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
@@ -41,6 +41,11 @@
<target type='virtio' name='org.qemu.guest_agent.3'/>
<address type='virtio-serial' controller='0' bus='0' port='4'/>
</channel>
+ <channel type='unix'>
+ <source mode='bind' path='/var/lib/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.4'/>
+ <target type='virtio' name='org.qemu.guest_agent.4'/>
+ <address type='virtio-serial' controller='0' bus='0' port='5'/>
+ </channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<audio id='1' type='none'/>
diff --git a/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml b/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
index d02ea52408d..738c1184c0e 100644
--- a/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
+++ b/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
@@ -38,6 +38,10 @@
<target type='virtio' name='org.qemu.guest_agent.3'/>
<address type='virtio-serial' controller='0' bus='0' port='4'/>
</channel>
+ <channel type='unix'>
+ <target type='virtio' name='org.qemu.guest_agent.4'/>
+ <address type='virtio-serial' controller='0' bus='0' port='5'/>
+ </channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<audio id='1' type='none'/>

View File

@ -0,0 +1,229 @@
From 8abc979bb09ca4b93123e8f75f3d28cc421a0bb6 Mon Sep 17 00:00:00 2001
From: Michal Privoznik <mprivozn@redhat.com>
Date: Thu, 20 Apr 2023 10:16:43 +0200
Subject: [PATCH] qemu: Move channelTargetDir into stateDir
For historical reasons (i.e. unknown reason) we put channel
sockets into a path derived from cfg->libDir which is a path that
survives host reboots (e.g. /var/lib/libvirt/...). This is not
necessary and in fact for session daemon creates a longer prefix:
XDG_CONFIG_HOME -> /home/user/.config
XDG_RUNTIME_DIR -> /run/user/1000
Worse, if host is rebooted suddenly (e.g. due to power loss) then
we leave files behind and nobody will ever remove them.
Therefore, place the channel target dir into state dir.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2173980
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
---
libvirt.spec.in | 1 -
src/qemu/qemu_conf.c | 9 ++--
src/qemu/qemu_domain.c | 52 +++++++++++++++++--
.../qemuhotplug-qemu-agent-detach.xml | 2 +-
...emuhotplug-base-live+qemu-agent-detach.xml | 2 +-
.../qemuhotplug-base-live+qemu-agent.xml | 2 +-
.../channel-unix-source-path.xml | 4 ++
.../channel-unix-source-path-active.xml | 5 ++
.../channel-unix-source-path-inactive.xml | 4 ++
tests/testutilsqemu.c | 2 +-
10 files changed, 67 insertions(+), 16 deletions(-)
diff --git a/libvirt.spec.in b/libvirt.spec.in
index 3b179d1fd98..7157cfe3b4f 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -2135,7 +2135,6 @@ exit 0
%ghost %dir %{_rundir}/libvirt/qemu/slirp/
%ghost %dir %{_rundir}/libvirt/qemu/swtpm/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/
-%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/checkpoint/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/dump/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/nvram/
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 532fe36be36..3f811d064fe 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -138,6 +138,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
cfg->configBaseDir = g_strdup_printf("%s/etc", root);
cfg->stateDir = g_strdup_printf("%s/run/qemu", root);
cfg->swtpmStateDir = g_strdup_printf("%s/run/swtpm", root);
+ cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
cfg->cacheDir = g_strdup_printf("%s/cache/qemu", root);
cfg->libDir = g_strdup_printf("%s/lib/qemu", root);
cfg->swtpmStorageDir = g_strdup_printf("%s/lib/swtpm", root);
@@ -146,7 +147,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir);
cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir);
cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir);
- cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir);
cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir);
} else if (privileged) {
@@ -158,8 +158,8 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
cfg->configBaseDir = g_strdup(SYSCONFDIR "/libvirt");
cfg->stateDir = g_strdup_printf("%s/libvirt/qemu", RUNSTATEDIR);
-
cfg->swtpmStateDir = g_strdup_printf("%s/libvirt/qemu/swtpm", RUNSTATEDIR);
+ cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
cfg->cacheDir = g_strdup_printf("%s/cache/libvirt/qemu", LOCALSTATEDIR);
@@ -168,7 +168,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir);
cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir);
cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir);
- cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir);
cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir);
cfg->swtpmStorageDir = g_strdup_printf("%s/lib/libvirt/swtpm",
@@ -191,8 +190,8 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
rundir = virGetUserRuntimeDirectory();
cfg->stateDir = g_strdup_printf("%s/qemu/run", rundir);
-
cfg->swtpmStateDir = g_strdup_printf("%s/swtpm", cfg->stateDir);
+ cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
cfg->configBaseDir = virGetUserConfigDirectory();
@@ -202,8 +201,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
cfg->checkpointDir = g_strdup_printf("%s/qemu/checkpoint",
cfg->configBaseDir);
cfg->autoDumpPath = g_strdup_printf("%s/qemu/dump", cfg->configBaseDir);
- cfg->channelTargetDir = g_strdup_printf("%s/qemu/channel",
- cfg->configBaseDir);
cfg->nvramDir = g_strdup_printf("%s/qemu/nvram", cfg->configBaseDir);
cfg->memoryBackingDir = g_strdup_printf("%s/qemu/ram", cfg->configBaseDir);
cfg->swtpmStorageDir = g_strdup_printf("%s/qemu/swtpm",
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 224350dabc3..d46516856eb 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -5153,6 +5153,28 @@ qemuDomainDefaultNetModel(const virDomainDef *def,
}
+
+static bool
+qemuDomainChrMatchDefaultPath(const char *prefix,
+ const char *infix,
+ const char *target,
+ const char *path)
+{
+ g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+ g_autofree char *regexp = NULL;
+
+ virBufferEscapeRegex(&buf, "^%s", prefix);
+ if (infix)
+ virBufferEscapeRegex(&buf, "%s", infix);
+ virBufferAddLit(&buf, "/(target/)?([^/]+\\.)|(domain-[^/]+/)|([0-9]+-[^/]+/)");
+ virBufferEscapeRegex(&buf, "%s$", target);
+
+ regexp = virBufferContentAndReset(&buf);
+
+ return virStringMatch(path, regexp);
+}
+
+
/*
* Clear auto generated unix socket paths:
*
@@ -5173,6 +5195,9 @@ qemuDomainDefaultNetModel(const virDomainDef *def,
*
* 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.
+ *
+ * Please note, as of libvirt 9.7.0 the channelTargetDir is no longer derived
+ * from cfg->libDir but rather cfg->stateDir.
*/
static void
qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr,
@@ -5191,14 +5216,31 @@ qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr,
cfg = virQEMUDriverGetConfig(driver);
- virBufferEscapeRegex(&buf, "^%s", cfg->channelTargetDir);
- virBufferAddLit(&buf, "/(target/)?([^/]+\\.)|(domain-[^/]+/)|([0-9]+-[^/]+/)");
- virBufferEscapeRegex(&buf, "%s$", chr->target.name);
+ if (qemuDomainChrMatchDefaultPath(cfg->channelTargetDir,
+ NULL,
+ chr->target.name,
+ chr->source->data.nix.path)) {
+ VIR_FREE(chr->source->data.nix.path);
+ return;
+ }
- regexp = virBufferContentAndReset(&buf);
+ /* Previously, channelTargetDir was derived from cfg->libdir, or
+ * cfg->configBaseDir even. Try them too. */
+ if (qemuDomainChrMatchDefaultPath(cfg->libDir,
+ "/channel",
+ chr->target.name,
+ chr->source->data.nix.path)) {
+ VIR_FREE(chr->source->data.nix.path);
+ return;
+ }
- if (virStringMatch(chr->source->data.nix.path, regexp))
+ if (qemuDomainChrMatchDefaultPath(cfg->configBaseDir,
+ "/qemu/channel",
+ chr->target.name,
+ chr->source->data.nix.path)) {
VIR_FREE(chr->source->data.nix.path);
+ return;
+ }
}
diff --git a/tests/qemuxml2argvdata/channel-unix-source-path.xml b/tests/qemuxml2argvdata/channel-unix-source-path.xml
index db0e99c3d12..df548d88e72 100644
--- a/tests/qemuxml2argvdata/channel-unix-source-path.xml
+++ b/tests/qemuxml2argvdata/channel-unix-source-path.xml
@@ -28,6 +28,10 @@
<source mode='bind' path='/var/lib/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.4'/>
<target type='virtio' name='org.qemu.guest_agent.4'/>
</channel>
+ <channel type='unix'>
+ <source mode='bind' path='/var/run/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.5'/>
+ <target type='virtio' name='org.qemu.guest_agent.5'/>
+ </channel>
<memballoon model='none'/>
</devices>
</domain>
diff --git a/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml b/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
index 68835ceb151..ec927d37c68 100644
--- a/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
+++ b/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
@@ -46,6 +46,11 @@
<target type='virtio' name='org.qemu.guest_agent.4'/>
<address type='virtio-serial' controller='0' bus='0' port='5'/>
</channel>
+ <channel type='unix'>
+ <source mode='bind' path='/var/run/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.5'/>
+ <target type='virtio' name='org.qemu.guest_agent.5'/>
+ <address type='virtio-serial' controller='0' bus='0' port='6'/>
+ </channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<audio id='1' type='none'/>
diff --git a/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml b/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
index 738c1184c0e..c979bedb392 100644
--- a/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
+++ b/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
@@ -42,6 +42,10 @@
<target type='virtio' name='org.qemu.guest_agent.4'/>
<address type='virtio-serial' controller='0' bus='0' port='5'/>
</channel>
+ <channel type='unix'>
+ <target type='virtio' name='org.qemu.guest_agent.5'/>
+ <address type='virtio-serial' controller='0' bus='0' port='6'/>
+ </channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<audio id='1' type='none'/>

View File

@ -0,0 +1,29 @@
From b07640bb438d21e592d66ca8367904d82838602f Mon Sep 17 00:00:00 2001
From: Michal Privoznik <mprivozn@redhat.com>
Date: Thu, 17 Aug 2023 17:43:54 +0200
Subject: [PATCH] qemu_domain: Drop unused variables from
qemuDomainChrDefDropDefaultPath()
In mu previous commits I've moved internals of
qemuDomainChrDefDropDefaultPath() into a separate function
(qemuDomainChrMatchDefaultPath()) but forgot to remove @buf and
@regexp variables which are now unused.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
src/qemu/qemu_domain.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index d46516856eb..f64836fbb17 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -5204,8 +5204,6 @@ qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr,
virQEMUDriver *driver)
{
g_autoptr(virQEMUDriverConfig) cfg = NULL;
- g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
- g_autofree char *regexp = NULL;
if (chr->deviceType != VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL ||
chr->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO ||

View File

@ -229,7 +229,7 @@
Summary: Library providing a simple virtualization API
Name: libvirt
Version: 9.0.0
Release: 10.2%{?dist}%{?extra_release}
Release: 10.3%{?dist}%{?extra_release}.alma.1
License: LGPLv2+
URL: https://libvirt.org/
@ -307,6 +307,13 @@ Patch66: libvirt-docs-Document-memory-allocation-and-emulator-pinning-limitation
Patch67: libvirt-conf-Fix-migration-in-some-firmware-autoselection-scenarios.patch
Patch68: libvirt-virpci-Resolve-leak-in-virPCIVirtualFunctionList-cleanup.patch
# Patches were taken from and backported to apply cleanly:
# https://github.com/libvirt/libvirt/commit/d3759d3674ab9453e5fb5a27ab6c28b8ff8d5569
Patch69: qemu-generate-shorter-channel-target-paths.patch
# https://github.com/libvirt/libvirt/commit/8abc979bb09ca4b93123e8f75f3d28cc421a0bb6
Patch70: qemu-move-channelTargetDir-into-stateDir.patch
# https://github.com/libvirt/libvirt/commit/b07640bb438d21e592d66ca8367904d82838602f
Patch71: qemu_domain-drop-unused-variables-from.patch
Requires: libvirt-daemon = %{version}-%{release}
Requires: libvirt-daemon-config-network = %{version}-%{release}
@ -2069,8 +2076,6 @@ exit 0
%ghost %dir %{_rundir}/libvirt/qemu/slirp/
%ghost %dir %{_rundir}/libvirt/qemu/swtpm/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/target/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/checkpoint/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/dump/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/nvram/
@ -2399,6 +2404,11 @@ exit 0
%endif
%changelog
* Wed Sep 13 2023 Eduard Abdullin <eabdullin@almalinux.org> - 9.0.0-10.3.el9_2.alma.1
- qemu: Generate shorter channel target paths
- qemu: Move channelTargetDir into stateDir
- qemu_domain: Drop unused variables from qemuDomainChrDefDropDefaultPath()
* Mon May 29 2023 Jiri Denemark <jdenemar@redhat.com> - 9.0.0-10.2.el9_2
- virpci: Resolve leak in virPCIVirtualFunctionList cleanup (CVE-2023-2700, rhbz#2208596)