Expecting every pointer member from s->parameters to be freed individually is prone to leave some fields forgotten when the code is eventually updated. Use a dealloc visitor to free them all at once.
Reviewed-by: Peter Xu <[email protected]> Signed-off-by: Fabiano Rosas <[email protected]> --- migration/options.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/migration/options.c b/migration/options.c index f7c154079bd..6d7ef2df986 100644 --- a/migration/options.c +++ b/migration/options.c @@ -16,6 +16,7 @@ #include "qemu/units.h" #include "exec/target_page.h" #include "qapi/clone-visitor.h" +#include "qapi/dealloc-visitor.h" #include "qapi/error.h" #include "qapi/qapi-commands-migration.h" #include "qapi/qapi-visit-migration.h" @@ -1058,11 +1059,21 @@ AnnounceParameters *migrate_announce_params(void) return ≈ } -static void migrate_tls_opts_free(MigrationParameters *params) +static bool migrate_params_free(MigrationParameters *params, Error **errp) { - qapi_free_StrOrNull(params->tls_creds); - qapi_free_StrOrNull(params->tls_hostname); - qapi_free_StrOrNull(params->tls_authz); + Visitor *v = qapi_dealloc_visitor_new(); + bool ret; + + /* + * qapi_free_MigrationParameters can't be used here because + * MigrationParameters is embedded in MigrationState due to qdev + * needing to access the offset of the migration properties inside + * the migration object. + */ + ret = visit_type_MigrationParameters_members(v, params, errp); + visit_free(v); + + return ret; } /* normalize QTYPE_QNULL to QTYPE_QSTRING "" */ @@ -1412,9 +1423,9 @@ void qmp_migrate_set_parameters(MigrationParameters *input, Error **errp) return; } - migrate_tls_opts_free(cur); - qapi_free_BitmapMigrationNodeAliasList(cur->block_bitmap_mapping); - qapi_free_strList(cur->cpr_exec_command); + if (!migrate_params_free(cur, errp)) { + return; + } QAPI_CLONE_MEMBERS(MigrationParameters, cur, new); -- 2.53.0
