From 02b031a475f5d9a5ec42d7a2eec08b3042c32da0 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 28 May 2018 15:17:01 +0200 Subject: [PATCH] qemu: domain: Add helpers for partially clearing qemuDomainSecretInfoPtr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's desired to keep the alias around to allow referencing of the secret object used with qemu. Add set of APIs which will destroy all data except the alias. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/qemu/qemu_domain.c | 55 +++++++++++++++++++++++++++++++----------- src/qemu/qemu_domain.h | 2 ++ 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index f6a629364b..f72c49f392 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -949,38 +949,65 @@ qemuDomainSecretPlainClear(qemuDomainSecretPlain secret) static void -qemuDomainSecretAESClear(qemuDomainSecretAES secret) +qemuDomainSecretAESClear(qemuDomainSecretAES secret, + bool keepAlias) { + if (!keepAlias) + VIR_FREE(secret.alias); + VIR_FREE(secret.username); - VIR_FREE(secret.alias); VIR_FREE(secret.iv); VIR_FREE(secret.ciphertext); } +static void +qemuDomainSecretInfoClear(qemuDomainSecretInfoPtr secinfo, + bool keepAlias) +{ + if (!secinfo) + return; + + switch ((qemuDomainSecretInfoType) secinfo->type) { + case VIR_DOMAIN_SECRET_INFO_TYPE_PLAIN: + qemuDomainSecretPlainClear(secinfo->s.plain); + break; + + case VIR_DOMAIN_SECRET_INFO_TYPE_AES: + qemuDomainSecretAESClear(secinfo->s.aes, keepAlias); + break; + + case VIR_DOMAIN_SECRET_INFO_TYPE_LAST: + break; + } +} + + void qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo) { if (!*secinfo) return; - switch ((qemuDomainSecretInfoType) (*secinfo)->type) { - case VIR_DOMAIN_SECRET_INFO_TYPE_PLAIN: - qemuDomainSecretPlainClear((*secinfo)->s.plain); - break; - - case VIR_DOMAIN_SECRET_INFO_TYPE_AES: - qemuDomainSecretAESClear((*secinfo)->s.aes); - break; - - case VIR_DOMAIN_SECRET_INFO_TYPE_LAST: - break; - } + qemuDomainSecretInfoClear(*secinfo, false); VIR_FREE(*secinfo); } +/** + * qemuDomainSecretInfoDestroy: + * @secinfo: object to destroy + * + * Removes any data unnecessary for further use, but keeps alias allocated. + */ +void +qemuDomainSecretInfoDestroy(qemuDomainSecretInfoPtr secinfo) +{ + qemuDomainSecretInfoClear(secinfo, true); +} + + static virClassPtr qemuDomainDiskPrivateClass; static void qemuDomainDiskPrivateDispose(void *obj); diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index f76404e1ac..3e139e0c57 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -836,6 +836,8 @@ bool qemuDomainSupportsEncryptedSecret(qemuDomainObjPrivatePtr priv); void qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo) ATTRIBUTE_NONNULL(1); +void qemuDomainSecretInfoDestroy(qemuDomainSecretInfoPtr secinfo); + void qemuDomainSecretDiskDestroy(virDomainDiskDefPtr disk) ATTRIBUTE_NONNULL(1);