From: Stefano Garzarella <sgarzare@redhat.com>
qigvm_directive_parameter_area() allocates a QIgvmParameterData entry
for each parameter area, allocates the data buffer, and queues it in
the list.
At the end of qigvm_process_file() we iterate the list to only free
the data buffer of each entry, but never the entry itself, so all of
them are leaked.
Let's also free the entry itself and remove it from the list. We could
avoid the removal since the list lives on the stack, but it's better to
leave the list consistent.
Fixes: c1d466d267cf ("backends/igvm: Add IGVM loader and configuration")
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
---
backends/igvm.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/backends/igvm.c b/backends/igvm.c
index 58f3097e85..605a3f3a36 100644
--- a/backends/igvm.c
+++ b/backends/igvm.c
@@ -1044,7 +1044,7 @@ int qigvm_process_file(IgvmCfg *cfg, MachineState *machine_state,
bool onlyVpContext, Error **errp)
{
int32_t header_count;
- QIgvmParameterData *parameter;
+ QIgvmParameterData *parameter, *tmp;
int retval = -1;
QIgvm ctx;
@@ -1142,10 +1142,11 @@ int qigvm_process_file(IgvmCfg *cfg, MachineState *machine_state,
}
cleanup_parameters:
- QTAILQ_FOREACH(parameter, &ctx.parameter_data, next)
+ QTAILQ_FOREACH_SAFE(parameter, &ctx.parameter_data, next, tmp)
{
+ QTAILQ_REMOVE(&ctx.parameter_data, parameter, next);
g_free(parameter->data);
- parameter->data = NULL;
+ g_free(parameter);
}
g_free(ctx.id_block);
g_free(ctx.id_auth);
--
2.56.0