From c163111b581bd1ee7d2668063b251a05e285d8f0 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Fri, 3 Apr 2015 20:58:20 +0200 Subject: [PATCH] virQEMUDriverGetConfig: Fix memleak ==19015== 968 (416 direct, 552 indirect) bytes in 1 blocks are definitely lost in loss record 999 of 1,049 ==19015== at 0x4C2C070: calloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==19015== by 0x52ADF14: virAllocVar (viralloc.c:560) ==19015== by 0x5302FD1: virObjectNew (virobject.c:193) ==19015== by 0x1DD9401E: virQEMUDriverConfigNew (qemu_conf.c:164) ==19015== by 0x1DDDF65D: qemuStateInitialize (qemu_driver.c:666) ==19015== by 0x53E0823: virStateInitialize (libvirt.c:777) ==19015== by 0x11E067: daemonRunStateInit (libvirtd.c:905) ==19015== by 0x53201AD: virThreadHelper (virthread.c:206) ==19015== by 0xA1EE1F2: start_thread (in /lib64/libpthread-2.19.so) ==19015== by 0xA4EFC8C: clone (in /lib64/libc-2.19.so) Signed-off-by: Michal Privoznik (cherry picked from commit 225aa80246d5e4a9e3a16ebd4c482525045da3db) --- src/qemu/qemu_cgroup.c | 4 +++- src/qemu/qemu_command.c | 5 ++++- src/qemu/qemu_domain.c | 14 ++++++++------ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index f8f0e3c840..3f3457a7a1 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -1270,11 +1270,13 @@ qemuRemoveCgroup(virQEMUDriverPtr driver, virDomainObjPtr vm) { qemuDomainObjPrivatePtr priv = vm->privateData; - virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + virQEMUDriverConfigPtr cfg; if (priv->cgroup == NULL) return 0; /* Not supported, so claim success */ + cfg = virQEMUDriverGetConfig(driver); + if (virCgroupTerminateMachine(vm->def->name, "qemu", cfg->privileged) < 0) { diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6526ba84c1..8202219e75 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7766,7 +7766,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, char **tapfdName = NULL; char **vhostfdName = NULL; int actualType = virDomainNetGetActualType(net); - virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + virQEMUDriverConfigPtr cfg = NULL; virNetDevBandwidthPtr actualBandwidth; size_t i; @@ -7802,6 +7802,8 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, return -1; } + cfg = virQEMUDriverGetConfig(driver); + if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK || actualType == VIR_DOMAIN_NET_TYPE_BRIDGE) { tapfdSize = net->driver.virtio.queues; @@ -7983,6 +7985,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, VIR_FREE(host); VIR_FREE(tapfdName); VIR_FREE(vhostfdName); + virObjectUnref(cfg); return ret; } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ac5ca74a83..b5803c86b6 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1081,6 +1081,9 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virQEMUDriverPtr driver = opaque; virQEMUDriverConfigPtr cfg = NULL; + if (driver) + cfg = virQEMUDriverGetConfig(driver); + if (dev->type == VIR_DOMAIN_DEVICE_NET && dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV && !dev->data.net->model) { @@ -1094,7 +1097,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virDomainDiskDefPtr disk = dev->data.disk; /* both of these require data from the driver config */ - if (driver && (cfg = virQEMUDriverGetConfig(driver))) { + if (cfg) { /* assign default storage format and driver according to config */ if (cfg->allowDiskFormatProbing) { /* default disk format for drives */ @@ -1103,7 +1106,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virDomainDiskGetType(disk) == VIR_STORAGE_TYPE_BLOCK)) virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_AUTO); - /* default disk format for mirrored drive */ + /* default disk format for mirrored drive */ if (disk->mirror && disk->mirror->format == VIR_STORAGE_FILE_NONE) disk->mirror->format = VIR_STORAGE_FILE_AUTO; @@ -1111,7 +1114,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, /* default driver if probing is forbidden */ if (!virDomainDiskGetDriver(disk) && virDomainDiskSetDriver(disk, "qemu") < 0) - goto cleanup; + goto cleanup; /* default disk format for drives */ if (virDomainDiskGetFormat(disk) == VIR_STORAGE_FILE_NONE && @@ -1119,7 +1122,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virDomainDiskGetType(disk) == VIR_STORAGE_TYPE_BLOCK)) virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_RAW); - /* default disk format for mirrored drive */ + /* default disk format for mirrored drive */ if (disk->mirror && disk->mirror->format == VIR_STORAGE_FILE_NONE) disk->mirror->format = VIR_STORAGE_FILE_RAW; @@ -1147,8 +1150,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, dev->data.chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL && dev->data.chr->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO && dev->data.chr->source.type == VIR_DOMAIN_CHR_TYPE_UNIX && - !dev->data.chr->source.data.nix.path && - (driver && (cfg = virQEMUDriverGetConfig(driver)))) { + !dev->data.chr->source.data.nix.path && cfg) { if (virAsprintf(&dev->data.chr->source.data.nix.path, "%s/channel/target/%s.%s",