[PATCH 3/5] qemuDomainObjPrivateFree: Free @masterKey too

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This one's a bit more complicated. In qemuProcessPrepareDomain()
a master key for encrypting secret for ciphered disks is created.
This object lives within qemuDomainObjPrivate object. It is freed
in qemuProcessStop(), but if nobody calls it (for instance like
our qemuxml2argvtest does), the key object leaks.

==17078== 32 bytes in 1 blocks are definitely lost in loss record 633 of 707
==17078==    at 0x4C2C070: calloc (vg_replace_malloc.c:623)
==17078==    by 0xAD924DF: virAllocN (viralloc.c:191)
==17078==    by 0x5050BA6: virCryptoGenerateRandom (qemuxml2argvmock.c:166)
==17078==    by 0x453DC8: qemuDomainMasterKeyCreate (qemu_domain.c:678)
==17078==    by 0x47A36B: qemuProcessPrepareDomain (qemu_process.c:4913)
==17078==    by 0x47C728: qemuProcessCreatePretendCmd (qemu_process.c:5542)
==17078==    by 0x433698: testCompareXMLToArgvFiles (qemuxml2argvtest.c:332)
==17078==    by 0x4339AC: testCompareXMLToArgvHelper (qemuxml2argvtest.c:413)
==17078==    by 0x446E7A: virTestRun (testutils.c:179)
==17078==    by 0x445BD9: mymain (qemuxml2argvtest.c:2022)
==17078==    by 0x44886F: virTestMain (testutils.c:969)
==17078==    by 0x445D9B: main (qemuxml2argvtest.c:2036)

Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx>
---
 src/qemu/qemu_domain.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 930e0b7..04aeaf2 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -547,6 +547,18 @@ qemuDomainWriteMasterKeyFile(virQEMUDriverPtr driver,
 }
 
 
+static void
+qemuDomainMasterKeyFree(qemuDomainObjPrivatePtr priv)
+{
+    if (!priv->masterKey)
+        return;
+
+    if (priv->masterKeyLen > 0)
+        memset(priv->masterKey, 0, priv->masterKeyLen);
+    VIR_FREE(priv->masterKey);
+    priv->masterKeyLen = 0;
+}
+
 /* qemuDomainMasterKeyReadFile:
  * @priv: pointer to domain private object
  *
@@ -619,9 +631,7 @@ qemuDomainMasterKeyReadFile(qemuDomainObjPrivatePtr priv)
     return 0;
 
  error:
-    if (masterKeyLen > 0)
-        memset(masterKey, 0, masterKeyLen);
-    VIR_FREE(masterKey);
+    qemuDomainMasterKeyFree(priv);
 
     VIR_FORCE_CLOSE(fd);
     VIR_FREE(path);
@@ -645,9 +655,7 @@ qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv)
         return;
 
     /* Clear the contents */
-    memset(priv->masterKey, 0, priv->masterKeyLen);
-    VIR_FREE(priv->masterKey);
-    priv->masterKeyLen = 0;
+    qemuDomainMasterKeyFree(priv);
 
     /* Delete the master key file */
     path = qemuDomainGetMasterKeyFilePath(priv->libDir);
@@ -1278,6 +1286,7 @@ qemuDomainObjPrivateFree(void *data)
 
     VIR_FREE(priv->libDir);
     VIR_FREE(priv->channelTargetDir);
+    qemuDomainMasterKeyFree(priv);
 
     VIR_FREE(priv);
 }
-- 
2.8.4

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]