diff options
author | Robert McQueen <robot101@debian.org> | 2006-04-28 21:02:16 +0000 |
---|---|---|
committer | Robert McQueen <robot101@debian.org> | 2006-04-28 21:02:16 +0000 |
commit | b3f18b3040663fb2dd631985d5a9010ba3a31265 (patch) | |
tree | 3dc0b797c20714cb468708eb070e8afa394b70d4 | |
parent | 6055e1cf44ffc03a1e338c0aa45ef22d1dd7ad1c (diff) |
2005-04-28 Robert McQueen <robot101@debian.org>
* glib/dbus-gvalue-utils.c: Patch from Jakub Stachowski to fix leaking
of memory from within pointer arrays and lists. Fixes bug #6300.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | glib/dbus-gvalue-utils.c | 62 |
2 files changed, 61 insertions, 6 deletions
@@ -1,5 +1,10 @@ 2005-04-28 Robert McQueen <robot101@debian.org> + * glib/dbus-gvalue-utils.c: Patch from Jakub Stachowski to fix leaking + of memory from within pointer arrays and lists. Fixes bug #6300. + +2005-04-28 Robert McQueen <robot101@debian.org> + * glib/dbus-gvalue.c: Patch from Jakub Stachowski to fix a leak in generating struct signatures. Fixes bug #6083. diff --git a/glib/dbus-gvalue-utils.c b/glib/dbus-gvalue-utils.c index f64a921f..39b4cd9b 100644 --- a/glib/dbus-gvalue-utils.c +++ b/glib/dbus-gvalue-utils.c @@ -772,6 +772,31 @@ gvalue_from_ptrarray_value (GValue *value, gpointer instance) } } +static void +gvalue_take_from_ptrarray_value (GValue *value, gpointer instance) +{ + switch (g_type_fundamental (G_VALUE_TYPE (value))) + { + case G_TYPE_STRING: + g_value_take_string (value, instance); + break; + case G_TYPE_POINTER: + g_value_set_pointer (value, instance); + g_assert_not_reached (); + break; + case G_TYPE_BOXED: + g_value_take_boxed (value, instance); + break; + case G_TYPE_OBJECT: + g_value_take_object (value, instance); + g_object_unref (g_value_get_object (value)); + break; + default: + g_assert_not_reached (); + break; + } +} + static gpointer ptrarray_value_from_gvalue (const GValue *value) { @@ -796,7 +821,7 @@ ptrarray_value_from_gvalue (const GValue *value) } static void -ptrarray_iterator (GType hash_type, +ptrarray_iterator (GType ptrarray_type, gpointer instance, DBusGTypeSpecializedCollectionIterator iterator, gpointer user_data) @@ -807,7 +832,7 @@ ptrarray_iterator (GType hash_type, ptrarray = instance; - elt_gtype = dbus_g_type_get_collection_specialization (hash_type); + elt_gtype = dbus_g_type_get_collection_specialization (ptrarray_type); for (i = 0; i < ptrarray->len; i++) { @@ -822,8 +847,8 @@ static void ptrarray_copy_elt (const GValue *val, gpointer user_data) { GPtrArray *dest = user_data; - GValue val_copy = {0, }; - + GValue val_copy = {0, }; + g_value_init (&val_copy, G_VALUE_TYPE (val)); g_value_copy (val, &val_copy); @@ -858,9 +883,22 @@ ptrarray_append (DBusGTypeSpecializedAppendContext *ctx, GValue *value) static void ptrarray_free (GType type, gpointer val) { - /* XXX: this function appears to leak the contents of the array */ GPtrArray *array; + GValue elt_val = {0, }; + GType elt_gtype; + unsigned int i; + array = val; + + elt_gtype = dbus_g_type_get_collection_specialization (type); + + for (i = 0; i < array->len; i++) + { + g_value_init (&elt_val, elt_gtype); + gvalue_take_from_ptrarray_value (&elt_val, g_ptr_array_index (array, i)); + g_value_unset (&elt_val); + } + g_ptr_array_free (array, TRUE); } @@ -943,9 +981,21 @@ slist_end_append (DBusGTypeSpecializedAppendContext *ctx) static void slist_free (GType type, gpointer val) { - /* XXX: this function appears to leak the contents of the list */ GSList *list; + GType elt_gtype; list = val; + + elt_gtype = dbus_g_type_get_collection_specialization (type); + + while (list != NULL) + { + GValue elt_val = {0, }; + g_value_init (&elt_val, elt_gtype); + gvalue_take_from_ptrarray_value (&elt_val, list->data); + g_value_unset (&elt_val); + list = g_slist_next(list); + } + list=val; g_slist_free (list); } |