From 943b527f267cf624bbd320562e42b3edfef9cb6f Mon Sep 17 00:00:00 2001 From: Bartlomiej Grzelewski Date: Tue, 6 Oct 2020 10:30:59 +0200 Subject: [PATCH] Fix memory leak * Release memory before pointer overwrite. * Free memory before overwrite pointer. * Memory leak with ref_accessible. * Leak in atspi_state_type_get_type. * Remove memory leak in atspi_event_listener_register_from_callback_full. * Reduce memory leaks reported on program exit. * This api is unused by efl but still let's fix it. Change-Id: Ifde65dd44643f2e58442cf70809703f979436e09 --- atspi/atspi-accessible.c | 2 ++ atspi/atspi-event-listener.c | 8 ++++++++ atspi/atspi-misc.c | 40 +++++++++++++++++++++++++++++++++++++--- atspi/atspi-stateset.c | 1 + 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/atspi/atspi-accessible.c b/atspi/atspi-accessible.c index b5d7616..61a3a88 100644 --- a/atspi/atspi-accessible.c +++ b/atspi/atspi-accessible.c @@ -899,6 +899,7 @@ atspi_accessible_get_parent (AtspiAccessible *obj, GError **error) } dbus_message_iter_init (reply, &iter); dbus_message_iter_recurse (&iter, &iter_variant); + g_object_unref(obj->accessible_parent); obj->accessible_parent = _atspi_dbus_return_accessible_from_iter (&iter_variant); dbus_message_unref (reply); _atspi_accessible_add_cache (obj, ATSPI_CACHE_PARENT); @@ -1222,6 +1223,7 @@ atspi_accessible_get_attributes (AtspiAccessible *obj, GError **error) { message = _atspi_dbus_call_partial (obj, atspi_interface_accessible, "GetAttributes", error, ""); + g_hash_table_unref(obj->attributes); obj->attributes = _atspi_dbus_return_hash_from_message (message); _atspi_accessible_add_cache (obj, ATSPI_CACHE_ATTRIBUTES); } diff --git a/atspi/atspi-event-listener.c b/atspi/atspi-event-listener.c index e7e7116..3d4a8fb 100644 --- a/atspi/atspi-event-listener.c +++ b/atspi/atspi-event-listener.c @@ -420,6 +420,12 @@ listener_entry_free (EventListenerEntry *e) g_free (e->name); if (e->detail) g_free (e->detail); callback_unref (callback); + + for (int i=0; i < e->properties->len; i++) + g_free(g_array_index(e->properties, char*, i)); + + g_array_free(e->properties, TRUE); + g_free (e); } @@ -1064,6 +1070,7 @@ _atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data) accessible = _atspi_dbus_return_accessible_from_iter (&iter_variant); if (!strcmp (category, "ScreenReader")) { + g_object_unref(e.source); e.source = accessible; if (e.source == NULL) { @@ -1131,6 +1138,7 @@ _atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data) g_free (name); g_free (detail); g_object_unref (e.source); + g_object_unref (e.sender); g_value_unset (&e.any_data); return DBUS_HANDLER_RESULT_HANDLED; } diff --git a/atspi/atspi-misc.c b/atspi/atspi-misc.c index 84c15df..12135e3 100644 --- a/atspi/atspi-misc.c +++ b/atspi/atspi-misc.c @@ -132,6 +132,8 @@ _atspi_bus () static AtspiAccessible *desktop; +static void cleanup_deferred_message (void); + static void cleanup () { @@ -152,6 +154,8 @@ cleanup () bus = NULL; } + cleanup_deferred_message(); + if (!desktop) return; @@ -455,8 +459,13 @@ add_accessible_from_iter (DBusMessageIter *iter) dbus_message_iter_get_basic (&iter_struct, &index); if (index >= 0 && accessible->accessible_parent) { - if (index >= accessible->accessible_parent->children->len) + if (index >= accessible->accessible_parent->children->len) { + /* There is no room for this object */ g_ptr_array_set_size (accessible->accessible_parent->children, index + 1); + } else { + /* This place is already taken - let's free this place with dignity */ + g_object_unref (g_ptr_array_index (accessible->accessible_parent->children, index)); + } g_ptr_array_index (accessible->accessible_parent->children, index) = g_object_ref (accessible); } @@ -765,6 +774,23 @@ process_deferred_message (BusDataClosure *closure) static GQueue *deferred_messages = NULL; +static void +destroy_deferred_message_item(gpointer ptr) +{ + /* TODO this is still memory leak on c->data */ + BusDataClosure *c = ptr; + dbus_message_unref (c->message); + dbus_connection_unref (c->bus); + g_free(c); +} + +static void +cleanup_deferred_message(void) +{ + g_queue_free_full(deferred_messages, destroy_deferred_message_item); + deferred_messages = NULL; +} + static gboolean process_deferred_messages (void) { @@ -1279,11 +1305,19 @@ _atspi_dbus_get_property (gpointer obj, const char *interface, const char *name, } if (!strcmp (type, "(so)")) { + g_object_unref(*(AtspiAccessible**)data); *((AtspiAccessible **)data) = _atspi_dbus_return_accessible_from_iter (&iter_variant); } else { + if (type [0] == 's') + { + g_free(*(char**)data); + *(char**) data = NULL; + } + dbus_message_iter_get_basic (&iter_variant, data); + if (type [0] == 's') *(char **)data = g_strdup (*(char **)data); } @@ -1411,7 +1445,7 @@ _atspi_dbus_set_interfaces (AtspiAccessible *accessible, DBusMessageIter *iter) accessible->interfaces = 0; if (strcmp (iter_sig, "as") != 0) { - g_warning ("_atspi_dbus_set_interfaces: Passed iterator with invalid signature %s", dbus_message_iter_get_signature (iter)); + g_warning ("_atspi_dbus_set_interfaces: Passed iterator with invalid signature %s", iter_sig); dbus_free (iter_sig); return; } @@ -1560,7 +1594,7 @@ get_accessibility_bus_address_dbus (void) address = g_strdup (tmp_address); dbus_message_unref (reply); } - + out: dbus_connection_unref (session_bus); return address; diff --git a/atspi/atspi-stateset.c b/atspi/atspi-stateset.c index c7e1fe2..35489d0 100644 --- a/atspi/atspi-stateset.c +++ b/atspi/atspi-stateset.c @@ -101,6 +101,7 @@ atspi_state_set_set_by_name (AtspiStateSet *set, const gchar *name, gboolean ena if (!value) { g_warning ("AT-SPI: Attempt to set unknown state '%s'", name); + g_type_class_unref (type_class); return; } else -- 2.7.4