]> xenbits.xensource.com Git - libvirt.git/commitdiff
testUpdateQEMUCaps: Don't leak host cpuData
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 31 May 2018 10:00:41 +0000 (12:00 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 31 May 2018 13:20:57 +0000 (15:20 +0200)
When preparing qemuCaps for test cases the following is
happening:

qemuTestParseCapabilitiesArch() is called, which calls
virQEMUCapsLoadCache() which in turn calls
virQEMUCapsInitHostCPUModel() which sets qemuCaps->kvmCPU and
qemuCaps->tcgCPU.

But then the code tries to update the capabilities:

testCompareXMLToArgv() calls testUpdateQEMUCaps() which calls
virQEMUCapsInitHostCPUModel() again overwriting previously
allocated memory. The solution is to free host cpuData in
testUpdateQEMUCaps().

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_capspriv.h
tests/qemuxml2argvtest.c

index e2e76e4dd8bbb98e9179c2f438f3a74a039c9a36..b8764eacd81f2e6a1f89b53af6e6d6051a1929c1 100644 (file)
@@ -1516,12 +1516,19 @@ virQEMUCapsHostCPUDataCopy(virQEMUCapsHostCPUDataPtr dst,
 
 
 static void
-virQEMUCapsHostCPUDataClear(virQEMUCapsHostCPUDataPtr cpuData)
+virQEMUCapsHostCPUDataClearModels(virQEMUCapsHostCPUDataPtr cpuData)
 {
-    qemuMonitorCPUModelInfoFree(cpuData->info);
     virCPUDefFree(cpuData->reported);
     virCPUDefFree(cpuData->migratable);
     virCPUDefFree(cpuData->full);
+}
+
+
+static void
+virQEMUCapsHostCPUDataClear(virQEMUCapsHostCPUDataPtr cpuData)
+{
+    qemuMonitorCPUModelInfoFree(cpuData->info);
+    virQEMUCapsHostCPUDataClearModels(cpuData);
 
     memset(cpuData, 0, sizeof(*cpuData));
 }
@@ -2834,6 +2841,16 @@ virQEMUCapsNewHostCPUModel(void)
 }
 
 
+void
+virQEMUCapsFreeHostCPUModel(virQEMUCapsPtr qemuCaps,
+                            virDomainVirtType type)
+{
+    virQEMUCapsHostCPUDataPtr cpuData = virQEMUCapsGetHostCPUData(qemuCaps, type);
+
+    virQEMUCapsHostCPUDataClearModels(cpuData);
+}
+
+
 void
 virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
                             virArch hostArch,
index 0199501c931b218e2d7193744664ac3f57b790b6..fea039ef3aa6d9b048f04f942e2e696975d23453 100644 (file)
@@ -56,6 +56,10 @@ void
 virQEMUCapsSetArch(virQEMUCapsPtr qemuCaps,
                    virArch arch);
 
+void
+virQEMUCapsFreeHostCPUModel(virQEMUCapsPtr qemuCaps,
+                            virDomainVirtType type);
+
 void
 virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
                             virArch hostArch,
index a6a40e273e9b6b8286b06d21060ddab230e60ce0..61c7ae59aae605c3c1e3fe3c779e5d296ff27957 100644 (file)
@@ -388,6 +388,9 @@ testUpdateQEMUCaps(const struct testInfo *info,
     if (testAddCPUModels(info->qemuCaps, info->skipLegacyCPUs) < 0)
         goto cleanup;
 
+    virQEMUCapsFreeHostCPUModel(info->qemuCaps, VIR_DOMAIN_VIRT_KVM);
+    virQEMUCapsFreeHostCPUModel(info->qemuCaps, VIR_DOMAIN_VIRT_QEMU);
+
     virQEMUCapsInitHostCPUModel(info->qemuCaps, caps->host.arch,
                                 VIR_DOMAIN_VIRT_KVM);
     virQEMUCapsInitHostCPUModel(info->qemuCaps, caps->host.arch,