summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>2020-10-06 10:30:59 +0200
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>2021-02-12 14:43:26 +0100
commit7fdbb0f96b464ad8753ec7468412dbb57c65fa45 (patch)
tree22ccbfc116438e38442846e41e5b1630c2a40cb2
parentc6b2af03425bacfef25b08f4730d6f7628743681 (diff)
downloadat-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.c3
-rw-r--r--atspi/atspi-event-listener.c8
-rw-r--r--atspi/atspi-misc.c36
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;