]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virQEMUDriverGetConfig: Fix memleak
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 3 Apr 2015 18:58:20 +0000 (20:58 +0200)
committerCole Robinson <crobinso@redhat.com>
Mon, 27 Apr 2015 23:36:21 +0000 (19:36 -0400)
==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 <mprivozn@redhat.com>
(cherry picked from commit 225aa80246d5e4a9e3a16ebd4c482525045da3db)

src/qemu/qemu_cgroup.c
src/qemu/qemu_command.c
src/qemu/qemu_domain.c

index f8f0e3c8405b404b85af77dc05d40876bb0ca7ee..3f3457a7a148f40a5a1456e577dda6f02c57a378 100644 (file)
@@ -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) {
index 6526ba84c1dfffb896bf9362c1739a604425c16f..8202219e7587baa68f095c0f0e366fac91749def 100644 (file)
@@ -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;
 }
 
index ac5ca74a83786c8326bc20145dd1048702361ab9..b5803c86b60b28a26d91d5d63b84da840032ddf2 100644 (file)
@@ -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",