The JSON writer is created at migrate_init() and freed at
migration_cleanup(). The latter is not called for snapshots. Add a
call to migration_cleanup_json_writer() to make sure it doesn't leak:
Indirect leak of 24 byte(s) in 1 object(s) allocated from:
#0 0x55ca12aabca0 in malloc
#1 0x7fd97d7e595d in g_malloc
#2 0x7fd97d7ffe38 in g_slice_alloc
#3 0x7fd97d8042e2 in g_string_sized_new
#4 0x55ca1571dd6b in json_writer_new ../qobject/json-writer.c:36:24
#5 0x55ca12e0de56 in migrate_init ../migration/migration.c:1718:21
#6 0x55ca12ec8fe6 in qemu_savevm_state ../migration/savevm.c:1921:11
#7 0x55ca12ec8b93 in save_snapshot ../migration/savevm.c:3380:11
Reviewed-by: Peter Xu <[email protected]>
Signed-off-by: Fabiano Rosas <[email protected]>
---
migration/migration.c | 2 +-
migration/migration.h | 1 +
migration/savevm.c | 1 +
3 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/migration/migration.c b/migration/migration.c
index b413d28622..d0b864a760 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1330,7 +1330,7 @@ void migrate_set_state(MigrationStatus *state,
MigrationStatus old_state,
}
}
-static void migration_cleanup_json_writer(MigrationState *s)
+void migration_cleanup_json_writer(MigrationState *s)
{
g_clear_pointer(&s->vmdesc, json_writer_free);
}
diff --git a/migration/migration.h b/migration/migration.h
index e47ff4e3d1..683bc7bdd5 100644
--- a/migration/migration.h
+++ b/migration/migration.h
@@ -633,4 +633,5 @@ void migration_bitmap_sync_precopy(bool last_stage);
void dirty_bitmap_mig_init(void);
bool should_send_vmdesc(void);
+void migration_cleanup_json_writer(MigrationState *s);
#endif
diff --git a/migration/savevm.c b/migration/savevm.c
index 8d4bdc28ab..4b590ea672 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1952,6 +1952,7 @@ static int qemu_savevm_state(QEMUFile *f, Error **errp)
}
cleanup:
qemu_savevm_state_cleanup();
+ migration_cleanup_json_writer(ms);
if (ret != 0) {
status = MIGRATION_STATUS_FAILED;
--
2.53.0