From 90b676d73fc6f817958083c0f159028a2f0b40ca Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 30 Sep 2010 16:21:01 -0400 Subject: [PATCH] Fix type free memleak Signed-off-by: Mathieu Desnoyers --- include/babeltrace/types.h | 1 + types/bitfield.c | 19 ++++++++++++++----- types/enum.c | 24 +++++++++++++++++------- types/float.c | 19 ++++++++++++++----- types/integer.c | 18 +++++++++++++----- types/types.c | 7 ++++++- 6 files changed, 65 insertions(+), 23 deletions(-) diff --git a/include/babeltrace/types.h b/include/babeltrace/types.h index 3dea99e5..417bb691 100644 --- a/include/babeltrace/types.h +++ b/include/babeltrace/types.h @@ -35,6 +35,7 @@ struct type_class { size_t (*copy)(unsigned char *dest, const struct format *fdest, const unsigned char *src, const struct format *fsrc, const struct type_class *type_class); + void (*free)(struct type_class *type_class); }; struct type_class_integer { diff --git a/types/bitfield.c b/types/bitfield.c index 03d3bbcb..a7111b1c 100644 --- a/types/bitfield.c +++ b/types/bitfield.c @@ -74,6 +74,18 @@ size_t bitfield_copy(unsigned char *dest, const struct format *fdest, } } +void bitfield_type_free(struct type_class_bitfield *bitfield_class) +{ + g_free(bitfield_class); +} + +static void _bitfield_type_free(struct type_class *type_class) +{ + struct type_class_bitfield *bitfield_class = + container_of(type_class, struct type_class_bitfield, p); + bitfield_type_free(bitfield_class); +} + struct type_class_bitfield *bitfield_type_new(const char *name, size_t start_offset, size_t len, int byte_order, @@ -88,6 +100,8 @@ struct type_class_bitfield *bitfield_type_new(const char *name, int_class = &bitfield_class->p; int_class->p.name = g_quark_from_string(name); int_class->p.alignment = alignment; + int_class->p.copy = bitfield_copy; + int_class->p.free = _bitfield_type_free; int_class->len = len; int_class->byte_order = byte_order; int_class->signedness = signedness; @@ -101,8 +115,3 @@ struct type_class_bitfield *bitfield_type_new(const char *name, } return bitfield_class; } - -void bitfield_type_free(struct type_class_bitfield *bitfield_class) -{ - g_free(bitfield_class); -} diff --git a/types/enum.c b/types/enum.c index 21af948b..0fbc1918 100644 --- a/types/enum.c +++ b/types/enum.c @@ -180,6 +180,21 @@ size_t enum_copy(unsigned char *dest, const struct format *fdest, return fdest->enum_write(dest, enum_class, v); } +void enum_type_free(struct type_class_enum *enum_class) +{ + g_hash_table_destroy(enum_class->table.value_to_quark); + g_hash_table_destroy(enum_class->table.quark_to_value); + g_free(enum_class); +} + +static +void _enum_type_free(struct type_class *type_class) +{ + struct type_class_enum *enum_class = + container_of(type_class, struct type_class_enum, p); + enum_type_free(enum_class); +} + struct type_class_enum *enum_type_new(const char *name, size_t start_offset, size_t len, int byte_order, @@ -201,6 +216,8 @@ struct type_class_enum *enum_type_new(const char *name, int_class = &bitfield_class->p; int_class->p.name = g_quark_from_string(name); int_class->p.alignment = alignment; + int_class->p.copy = enum_copy; + int_class->p.free = _enum_type_free; int_class->len = len; int_class->byte_order = byte_order; int_class->signedness = signedness; @@ -216,10 +233,3 @@ struct type_class_enum *enum_type_new(const char *name, } return enum_class; } - -void enum_type_free(struct type_class_enum *enum_class) -{ - g_hash_table_destroy(enum_class->table.value_to_quark); - g_hash_table_destroy(enum_class->table.quark_to_value); - g_free(enum_class); -} diff --git a/types/float.c b/types/float.c index 78499c8f..e42daa16 100644 --- a/types/float.c +++ b/types/float.c @@ -39,6 +39,18 @@ size_t float_copy(unsigned char *dest, const struct format *fdest, } } +void float_type_free(struct type_class_float *float_class) +{ + g_free(float_class); +} + +static void _float_type_free(struct type_class *type_class) +{ + struct type_class_float *float_class = + container_of(type_class, struct type_class_float, p); + float_type_free(float_class); +} + struct type_class_float *float_type_new(const char *name, size_t mantissa_len, size_t exp_len, int byte_order, @@ -50,6 +62,8 @@ struct type_class_float *float_type_new(const char *name, float_class = g_new(struct type_class_float, 1); float_class->p.name = g_quark_from_string(name); float_class->p.alignment = alignment; + float_class->p.copy = float_copy; + float_class->p.free = _float_type_free; float_class->mantissa_len = mantissa_len; float_class->exp_len = exp_len; float_class->byte_order = byte_order; @@ -62,8 +76,3 @@ struct type_class_float *float_type_new(const char *name, } return float_class; } - -void float_type_free(struct type_class_float *float_class) -{ - g_free(float_class); -} diff --git a/types/integer.c b/types/integer.c index cf01f07a..bafb6cb7 100644 --- a/types/integer.c +++ b/types/integer.c @@ -48,6 +48,18 @@ size_t integer_copy(unsigned char *dest, const struct format *fdest, } } +void integer_type_free(struct type_class_integer *int_class) +{ + g_free(int_class); +} + +static void _integer_type_free(struct type_class *type_class) +{ + struct type_class_integer *int_class = + container_of(type_class, struct type_class_integer, p); + integer_type_free(int_class); +} + struct type_class_integer *integer_type_new(const char *name, size_t start_offset, size_t len, int byte_order, @@ -61,6 +73,7 @@ struct type_class_integer *integer_type_new(const char *name, int_class->p.name = g_quark_from_string(name); int_class->p.alignment = alignment; int_class->p.copy = integer_copy; + int_class->p.free = _integer_type_free; int_class->len = len; int_class->byte_order = byte_order; int_class->signedness = signedness; @@ -73,8 +86,3 @@ struct type_class_integer *integer_type_new(const char *name, } return int_class; } - -void integer_type_free(struct type_class_integer *int_class) -{ - g_free(int_class); -} diff --git a/types/types.c b/types/types.c index 5c890551..675567f8 100644 --- a/types/types.c +++ b/types/types.c @@ -37,6 +37,11 @@ struct type_class *ctf_lookup_type(GQuark qname) (gconstpointer) (unsigned long) qname) } +static void free_type(struct type_class *type_class) +{ + type_class->free(type_class); +} + int ctf_register_type(struct type_class *type_class) { if (ctf_lookup_type_class(type_class->name)) @@ -51,7 +56,7 @@ int ctf_register_type(struct type_class *type_class) int ctf_init_types(void) { type_classes = g_hash_table_new_full(g_direct_hash, g_direct_equal, - NULL, g_free); + NULL, free_type); if (!type_classes) return -ENOMEM; return 0; -- 2.34.1