[libvirt] [PATCH 3/5] qemuDomainObjPrivateFree: Free @masterKey too
Peter Krempa
pkrempa at redhat.com
Mon Jul 11 12:31:45 UTC 2016
On Sat, Jul 09, 2016 at 10:19:03 +0200, Michal Privoznik wrote:
> 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 at redhat.com>
> ---
> 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);
Turn this into VIR_DISPOSE_N
> + 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);
This won't do what you've expected since priv->masterKey was not set
yet.
You can use VIR_DISPOSE_N directly here.
> + qemuDomainMasterKeyFree(priv);
>
> VIR_FORCE_CLOSE(fd);
> VIR_FREE(path);
ACK with the tweaks above.
More information about the libvir-list
mailing list