target/i386/sev: add finalize functions and fix leaking setters
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: a9b4942f485 ("target/i386: add Secure Encrypted Virtualization (SEV) object") Fixes: 7b34df44260 ("i386/sev: Introduce 'sev-snp-guest' object") Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Marc-André Lureau committed
Apr 27, 2026 at 14:48 UTC
a2258ed604dc3ba6121ff8ab406b774a97cca220
1 file changed
+37
target/i386/sev.c
+37
@@ -2526,6 +2526,7 @@ sev_common_get_sev_device(Object *obj, Error **errp)
2526
static void
2527
sev_common_set_sev_device(Object *obj, const char *value, Error **errp)
2528
{
2529
+ g_free(SEV_COMMON(obj)->sev_device);
2530
SEV_COMMON(obj)->sev_device = g_strdup(value);
2531
}
2532
@@ -2830,12 +2831,21 @@ sev_common_instance_init(Object *obj)
2831
QTAILQ_INIT(&sev_common->launch_vmsa);
2832
}
2833
2834
+static void
2835
+sev_common_finalize(Object *obj)
2836
+{
2837
+ SevCommonState *sev_common = SEV_COMMON(obj);
2838
+
2839
+ g_free(sev_common->sev_device);
2840
+}
2841
+
2842
/* sev guest info common to sev/sev-es/sev-snp */
2843
static const TypeInfo sev_common_info = {
2844
.parent = TYPE_X86_CONFIDENTIAL_GUEST,
2845
.name = TYPE_SEV_COMMON,
2846
.instance_size = sizeof(SevCommonState),
2847
.instance_init = sev_common_instance_init,
2848
+ .instance_finalize = sev_common_finalize,
2849
.class_size = sizeof(SevCommonStateClass),
2850
.class_init = sev_common_class_init,
2851
.abstract = true,
@@ -2855,6 +2865,7 @@ sev_guest_get_dh_cert_file(Object *obj, Error **errp)
2865
static void
2866
sev_guest_set_dh_cert_file(Object *obj, const char *value, Error **errp)
2867
{
2868
+ g_free(SEV_GUEST(obj)->dh_cert_file);
2869
SEV_GUEST(obj)->dh_cert_file = g_strdup(value);
2870
}
2871
@@ -2869,6 +2880,7 @@ sev_guest_get_session_file(Object *obj, Error **errp)
2880
static void
2881
sev_guest_set_session_file(Object *obj, const char *value, Error **errp)
2882
{
2883
+ g_free(SEV_GUEST(obj)->session_file);
2884
SEV_GUEST(obj)->session_file = g_strdup(value);
2885
}
2886
@@ -2936,12 +2948,23 @@ sev_guest_instance_init(Object *obj)
2948
sev_guest->legacy_vm_type = ON_OFF_AUTO_AUTO;
2949
}
2950
2951
+static void
2952
+sev_guest_finalize(Object *obj)
2953
+{
2954
+ SevGuestState *sev_guest = SEV_GUEST(obj);
2955
+
2956
+ g_free(sev_guest->dh_cert_file);
2957
+ g_free(sev_guest->session_file);
2958
+ g_free(sev_guest->measurement);
2959
+}
2960
+
2961
/* guest info specific sev/sev-es */
2962
static const TypeInfo sev_guest_info = {
2963
.parent = TYPE_SEV_COMMON,
2964
.name = TYPE_SEV_GUEST,
2965
.instance_size = sizeof(SevGuestState),
2966
.instance_init = sev_guest_instance_init,
2967
+ .instance_finalize = sev_guest_finalize,
2968
.class_init = sev_guest_class_init,
2969
};
2970
@@ -3194,6 +3217,19 @@ sev_snp_guest_instance_init(Object *obj)
3217
sev_snp_guest->kvm_start_conf.policy = DEFAULT_SEV_SNP_POLICY;
3218
}
3219
3220
+static void
3221
+sev_snp_guest_finalize(Object *obj)
3222
+{
3223
+ SevSnpGuestState *sev_snp_guest = SEV_SNP_GUEST(obj);
3224
+
3225
+ g_free(sev_snp_guest->guest_visible_workarounds);
3226
+ g_free(sev_snp_guest->id_block_base64);
3227
+ g_free(sev_snp_guest->id_block);
3228
+ g_free(sev_snp_guest->id_auth_base64);
3229
+ g_free(sev_snp_guest->id_auth);
3230
+ g_free(sev_snp_guest->host_data);
3231
+}
3232
+
3233
/* guest info specific to sev-snp */
3234
static const TypeInfo sev_snp_guest_info = {
3235
.parent = TYPE_SEV_COMMON,
@@ -3201,6 +3237,7 @@ static const TypeInfo sev_snp_guest_info = {
3237
.instance_size = sizeof(SevSnpGuestState),
3238
.class_init = sev_snp_guest_class_init,
3239
.instance_init = sev_snp_guest_instance_init,
3240
+ .instance_finalize = sev_snp_guest_finalize,
3241
};
3242
3243
static void