From 686f83e66ef885ca7f0bee7b90fac3a364b9c7bc Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 6 May 2022 14:50:06 +0200 Subject: [PATCH] qemu: Clear 'qemuFDPass' helpers of char devices when no longer needed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While the FDs are closed right after use to prevent leaks, at certain point we don't need the whole helper any more. Clear them for char devices after hotplug and on start. Signed-off-by: Peter Krempa Reviewed-by: Jonathon Jongsma Reviewed-by: Ján Tomko --- src/qemu/qemu_command.c | 2 ++ src/qemu/qemu_domain.c | 14 ++++++++++++-- src/qemu/qemu_domain.h | 3 +++ src/qemu/qemu_hotplug.c | 3 +++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 605086b242..5ee3874e53 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1547,6 +1547,8 @@ qemuBuildChardevCommand(virCommand *cmd, virCommandAddArgList(cmd, "-chardev", charstr, NULL); + qemuDomainChrSourcePrivateClearFDPass(chrSourcePriv); + return 0; } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9d090204fe..b960cd1730 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -908,13 +908,23 @@ qemuDomainChrSourcePrivateNew(void) } +void +qemuDomainChrSourcePrivateClearFDPass(qemuDomainChrSourcePrivate *priv) +{ + if (!priv) + return; + + g_clear_pointer(&priv->sourcefd, qemuFDPassFree); + g_clear_pointer(&priv->logfd, qemuFDPassFree); +} + + static void qemuDomainChrSourcePrivateDispose(void *obj) { qemuDomainChrSourcePrivate *priv = obj; - qemuFDPassFree(priv->sourcefd); - qemuFDPassFree(priv->logfd); + qemuDomainChrSourcePrivateClearFDPass(priv); g_free(priv->tlsCertPath); diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 3d1447178c..edbcc1aed2 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -359,6 +359,9 @@ struct _qemuDomainChrSourcePrivate { }; +void +qemuDomainChrSourcePrivateClearFDPass(qemuDomainChrSourcePrivate *priv); + typedef struct _qemuDomainVsockPrivate qemuDomainVsockPrivate; struct _qemuDomainVsockPrivate { virObject parent; diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 62cfc29a16..e8e028706b 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2293,6 +2293,9 @@ qemuDomainAttachChrDevice(virQEMUDriver *driver, if (teardowndevice && qemuDomainNamespaceTeardownChardev(vm, chr) < 0) VIR_WARN("Unable to remove chr device from /dev"); } + + qemuDomainChrSourcePrivateClearFDPass(charpriv); + return ret; exit_monitor: