@samitouri / QOSamiQemu / commits / a2258ed604

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