From: Peter Maydell <[email protected]>
The TYPE_RISCV_CPC device allocates an array in its instance_init,
but does not free this, leading to leaks like this from QOM/QMP
introspection:
Direct leak of 512 byte in 1 object allocated from:
#0 in calloc
#1 in g_malloc0
#2 in riscv_cpc_init
/home/pm215/qemu/build/san/../../hw/misc/riscv_cpc.c:175:15
#3 in object_initialize_with_type
/home/pm215/qemu/build/san/../../qom/object.c:570:5
#4 in object_new_with_type
/home/pm215/qemu/build/san/../../qom/object.c:774:5
#5 in qmp_device_list_properties
/home/pm215/qemu/build/san/../../qom/qom-qmp-cmds.c:206:11
#6 in qdev_device_help
/home/pm215/qemu/build/san/../../system/qdev-monitor.c:313:17
#7 in hmp_device_add
/home/pm215/qemu/build/san/../../system/qdev-monitor.c:1005:9
Free the array in instance_finalize.
Signed-off-by: Peter Maydell <[email protected]>
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Message-ID: <[email protected]>
Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
---
hw/misc/riscv_cpc.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/hw/misc/riscv_cpc.c b/hw/misc/riscv_cpc.c
index 231a419062f..4bf2fd8db16 100644
--- a/hw/misc/riscv_cpc.c
+++ b/hw/misc/riscv_cpc.c
@@ -185,6 +185,13 @@ static void riscv_cpc_init(Object *obj)
}
}
+static void riscv_cpc_finalize(Object *obj)
+{
+ RISCVCPCState *s = RISCV_CPC(obj);
+
+ g_free(s->cpus);
+}
+
static void riscv_cpc_realize(DeviceState *dev, Error **errp)
{
RISCVCPCState *s = RISCV_CPC(dev);
@@ -254,6 +261,7 @@ static const TypeInfo riscv_cpc_info = {
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(RISCVCPCState),
.instance_init = riscv_cpc_init,
+ .instance_finalize = riscv_cpc_finalize,
.class_init = riscv_cpc_class_init,
};
--
2.53.0