[at-spi2-core: 1/2] Fix memory leaks




commit 7fdbb0f96b464ad8753ec7468412dbb57c65fa45
Author: Bartlomiej Grzelewski <b grzelewski samsung com>
Date:   Tue Oct 6 10:30:59 2020 +0200

    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

 atspi/atspi-accessible.c     |  3 +++
 atspi/atspi-event-listener.c |  8 ++++++++
 atspi/atspi-misc.c           | 36 +++++++++++++++++++++++++++++++++++-
 3 files changed, 46 insertions(+), 1 deletion(-)
---
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;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]