Fix memory leak 67/245867/2 submit/tizen/20201018.221456
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>
Tue, 6 Oct 2020 08:30:59 +0000 (10:30 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Fri, 16 Oct 2020 14:41:21 +0000 (16:41 +0200)
* 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
atspi/atspi-event-listener.c
atspi/atspi-misc.c
atspi/atspi-stateset.c

index b5d7616..61a3a88 100644 (file)
@@ -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);
   }
index e7e7116..3d4a8fb 100644 (file)
@@ -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;
 }
index 84c15df..12135e3 100644 (file)
@@ -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;
index c7e1fe2..35489d0 100644 (file)
@@ -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