Use the recently introduced migrate_params_free routine at migration_instance_finalize() so that newly added pointers are already freed by default.
Special case: The TLS options are currently the only pointers that also have a qdev property implementation, so they will be freed by qdev using the .release method. Update the method so that a second invocation of qapi_free_StrOrNull doesn't assert. Reviewed-by: Peter Xu <[email protected]> Signed-off-by: Fabiano Rosas <[email protected]> --- migration/migration.c | 3 +-- migration/options.c | 7 ++++--- migration/options.h | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index b413d28622a..dab282dd2f3 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -4039,8 +4039,7 @@ static void migration_instance_finalize(Object *obj) { MigrationState *ms = MIGRATION(obj); - qapi_free_BitmapMigrationNodeAliasList(ms->parameters.block_bitmap_mapping); - qapi_free_strList(ms->parameters.cpr_exec_command); + migrate_params_free(&ms->parameters, NULL); qemu_mutex_destroy(&ms->error_mutex); qemu_mutex_destroy(&ms->qemu_file_lock); qemu_sem_destroy(&ms->wait_unplug_sem); diff --git a/migration/options.c b/migration/options.c index 6d7ef2df986..bd7be8f9832 100644 --- a/migration/options.c +++ b/migration/options.c @@ -271,8 +271,9 @@ static void set_StrOrNull(Object *obj, Visitor *v, const char *name, static void release_StrOrNull(Object *obj, const char *name, void *opaque) { - const Property *prop = opaque; - qapi_free_StrOrNull(*(StrOrNull **)object_field_prop_ptr(obj, prop)); + StrOrNull **ptr = object_field_prop_ptr(obj, opaque); + + g_clear_pointer(ptr, qapi_free_StrOrNull); } static void set_default_value_tls_opt(ObjectProperty *op, const Property *prop) @@ -1059,7 +1060,7 @@ AnnounceParameters *migrate_announce_params(void) return ≈ } -static bool migrate_params_free(MigrationParameters *params, Error **errp) +bool migrate_params_free(MigrationParameters *params, Error **errp) { Visitor *v = qapi_dealloc_visitor_new(); bool ret; diff --git a/migration/options.h b/migration/options.h index c272eb62084..c7da2d0b5b0 100644 --- a/migration/options.h +++ b/migration/options.h @@ -93,4 +93,5 @@ uint64_t migrate_rdma_chunk_size(void); bool migrate_params_check(MigrationParameters *params, Error **errp); void migrate_params_init(MigrationParameters *params); +bool migrate_params_free(MigrationParameters *params, Error **errp); #endif -- 2.53.0
