From a5c051b2cf11197b1663dfb470e80dbc32d77cd0 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Tue, 20 Jul 2021 14:53:58 +0200 Subject: [PATCH] i386: Never free migration blocker objects instead of sometimes invtsc_mig_blocker has static storage duration. When a CPU with certain features is initialized, and invtsc_mig_blocker is still null, we add a migration blocker and store it in invtsc_mig_blocker. The object is freed when migrate_add_blocker() fails, leaving invtsc_mig_blocker dangling. It is not freed on later failures. Same for hv_passthrough_mig_blocker and hv_no_nonarch_cs_mig_blocker. All failures are actually fatal, so whether we free or not doesn't really matter, except as bad examples to be copied / imitated. Clean this up in a minimal way: never free these blocker objects. Cc: Paolo Bonzini Cc: Marcelo Tosatti Cc: Eduardo Habkost Signed-off-by: Markus Armbruster Message-Id: <20210720125408.387910-7-armbru@redhat.com> Acked-by: Michael S. Tsirkin --- target/i386/kvm/kvm.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index e69abe48e3..57aed525b5 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -1437,7 +1437,6 @@ static int hyperv_init_vcpu(X86CPU *cpu) ret = migrate_add_blocker(hv_passthrough_mig_blocker, &local_err); if (local_err) { error_report_err(local_err); - error_free(hv_passthrough_mig_blocker); return ret; } } @@ -1452,7 +1451,6 @@ static int hyperv_init_vcpu(X86CPU *cpu) ret = migrate_add_blocker(hv_no_nonarch_cs_mig_blocker, &local_err); if (local_err) { error_report_err(local_err); - error_free(hv_no_nonarch_cs_mig_blocker); return ret; } } @@ -1892,7 +1890,6 @@ int kvm_arch_init_vcpu(CPUState *cs) r = migrate_add_blocker(invtsc_mig_blocker, &local_err); if (local_err) { error_report_err(local_err); - error_free(invtsc_mig_blocker); return r; } } -- 2.11.0