diff options
author | Bartlomiej Grzelewski <b.grzelewski@samsung.com> | 2020-10-06 10:30:59 +0200 |
---|---|---|
committer | Bartlomiej Grzelewski <b.grzelewski@samsung.com> | 2021-02-12 14:43:26 +0100 |
commit | 7fdbb0f96b464ad8753ec7468412dbb57c65fa45 (patch) | |
tree | 22ccbfc116438e38442846e41e5b1630c2a40cb2 | |
parent | c6b2af03425bacfef25b08f4730d6f7628743681 (diff) | |
download | at-spi2-core-7fdbb0f96b464ad8753ec7468412dbb57c65fa45.tar.gz |
Fix memory leaks
* Release memory before pointer overwrite.
* Reduce memory leaks reported in ref_accessible.
* Remove leak connected with atspi_state_type_get_type.
* Remove memory leak in
atspi_event_listener_register_from_callback_full.
* Reduce memory leaks reported on program exit.
Change-Id: Ifde65dd44643f2e58442cf70809703f979436e09
-rw-r--r-- | atspi/atspi-accessible.c | 3 | ||||
-rw-r--r-- | atspi/atspi-event-listener.c | 8 | ||||
-rw-r--r-- | atspi/atspi-misc.c | 36 |
3 files changed, 46 insertions, 1 deletions
diff --git a/atspi/atspi-accessible.c b/atspi/atspi-accessible.c index 103e2da6..58d7316f 100644 --- a/atspi/atspi-accessible.c +++ b/atspi/atspi-accessible.c @@ -418,6 +418,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); @@ -742,6 +743,8 @@ atspi_accessible_get_attributes (AtspiAccessible *obj, GError **error) { message = _atspi_dbus_call_partial (obj, atspi_interface_accessible, "GetAttributes", error, ""); + g_clear_pointer (&(obj->attributes), g_hash_table_unref); + 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 82e39b6d..00957dd1 100644 --- a/atspi/atspi-event-listener.c +++ b/atspi/atspi-event-listener.c @@ -393,6 +393,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); } @@ -1053,6 +1059,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; } else @@ -1112,6 +1119,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 f6882d25..f897c7ea 100644 --- a/atspi/atspi-misc.c +++ b/atspi/atspi-misc.c @@ -133,6 +133,8 @@ _atspi_bus () static AtspiAccessible *desktop; +static void cleanup_deferred_message (void); + static void cleanup () { @@ -456,7 +458,15 @@ add_accessible_from_iter (DBusMessageIter *iter) if (index >= 0 && accessible->accessible_parent) { 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 +775,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) { @@ -1273,10 +1300,17 @@ _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); @@ -1554,7 +1588,7 @@ get_accessibility_bus_address_dbus (void) address = g_strdup (tmp_address); dbus_message_unref (reply); } - + out: dbus_connection_unref (session_bus); return address; |