None of the three SEV types (sev-common, sev-guest, sev-snp-guest)
had instance_finalize functions, so all string fields allocated
during init or by property setters were leaked on object destruction.
Add sev_common_finalize, sev_guest_finalize, and
sev_snp_guest_finalize to free the allocated fields.
Also fix sev_common_set_sev_device, sev_guest_set_dh_cert_file,
and sev_guest_set_session_file to free the old value before
replacing it.
Fixes: a9b4942f485b ("target/i386: add Secure Encrypted Virtualization (SEV)
object")
Signed-off-by: Marc-André Lureau <[email protected]>
---
target/i386/sev.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/target/i386/sev.c b/target/i386/sev.c
index b44b5a1c2b9..99cf30806be 100644
--- a/target/i386/sev.c
+++ b/target/i386/sev.c
@@ -2526,6 +2526,7 @@ sev_common_get_sev_device(Object *obj, Error **errp)
static void
sev_common_set_sev_device(Object *obj, const char *value, Error **errp)
{
+ g_free(SEV_COMMON(obj)->sev_device);
SEV_COMMON(obj)->sev_device = g_strdup(value);
}
@@ -2830,12 +2831,21 @@ sev_common_instance_init(Object *obj)
QTAILQ_INIT(&sev_common->launch_vmsa);
}
+static void
+sev_common_finalize(Object *obj)
+{
+ SevCommonState *sev_common = SEV_COMMON(obj);
+
+ g_free(sev_common->sev_device);
+}
+
/* sev guest info common to sev/sev-es/sev-snp */
static const TypeInfo sev_common_info = {
.parent = TYPE_X86_CONFIDENTIAL_GUEST,
.name = TYPE_SEV_COMMON,
.instance_size = sizeof(SevCommonState),
.instance_init = sev_common_instance_init,
+ .instance_finalize = sev_common_finalize,
.class_size = sizeof(SevCommonStateClass),
.class_init = sev_common_class_init,
.abstract = true,
@@ -2855,6 +2865,7 @@ sev_guest_get_dh_cert_file(Object *obj, Error **errp)
static void
sev_guest_set_dh_cert_file(Object *obj, const char *value, Error **errp)
{
+ g_free(SEV_GUEST(obj)->dh_cert_file);
SEV_GUEST(obj)->dh_cert_file = g_strdup(value);
}
@@ -2869,6 +2880,7 @@ sev_guest_get_session_file(Object *obj, Error **errp)
static void
sev_guest_set_session_file(Object *obj, const char *value, Error **errp)
{
+ g_free(SEV_GUEST(obj)->session_file);
SEV_GUEST(obj)->session_file = g_strdup(value);
}
@@ -2936,12 +2948,23 @@ sev_guest_instance_init(Object *obj)
sev_guest->legacy_vm_type = ON_OFF_AUTO_AUTO;
}
+static void
+sev_guest_finalize(Object *obj)
+{
+ SevGuestState *sev_guest = SEV_GUEST(obj);
+
+ g_free(sev_guest->dh_cert_file);
+ g_free(sev_guest->session_file);
+ g_free(sev_guest->measurement);
+}
+
/* guest info specific sev/sev-es */
static const TypeInfo sev_guest_info = {
.parent = TYPE_SEV_COMMON,
.name = TYPE_SEV_GUEST,
.instance_size = sizeof(SevGuestState),
.instance_init = sev_guest_instance_init,
+ .instance_finalize = sev_guest_finalize,
.class_init = sev_guest_class_init,
};
@@ -3194,6 +3217,19 @@ sev_snp_guest_instance_init(Object *obj)
sev_snp_guest->kvm_start_conf.policy = DEFAULT_SEV_SNP_POLICY;
}
+static void
+sev_snp_guest_finalize(Object *obj)
+{
+ SevSnpGuestState *sev_snp_guest = SEV_SNP_GUEST(obj);
+
+ g_free(sev_snp_guest->guest_visible_workarounds);
+ g_free(sev_snp_guest->id_block_base64);
+ g_free(sev_snp_guest->id_block);
+ g_free(sev_snp_guest->id_auth_base64);
+ g_free(sev_snp_guest->id_auth);
+ g_free(sev_snp_guest->host_data);
+}
+
/* guest info specific to sev-snp */
static const TypeInfo sev_snp_guest_info = {
.parent = TYPE_SEV_COMMON,
@@ -3201,6 +3237,7 @@ static const TypeInfo sev_snp_guest_info = {
.instance_size = sizeof(SevSnpGuestState),
.class_init = sev_snp_guest_class_init,
.instance_init = sev_snp_guest_instance_init,
+ .instance_finalize = sev_snp_guest_finalize,
};
static void
--
2.54.0