]> git.0d.be Git - empathy.git/commitdiff
libempathy-gtk: Fix several memory leaks from libgee
authorPhilip Withnall <philip.withnall@collabora.co.uk>
Fri, 18 Oct 2013 13:24:15 +0000 (14:24 +0100)
committerPhilip Withnall <philip.withnall@collabora.co.uk>
Tue, 22 Oct 2013 09:36:18 +0000 (10:36 +0100)
libgee’s GeeIterator returns a new reference from most of its methods,
especially gee_iterable_iterator() and gee_iterator_get(). Add corresponding
g_object_unref() calls.

https://bugzilla.gnome.org/show_bug.cgi?id=710453

libempathy-gtk/empathy-individual-menu.c
libempathy-gtk/empathy-individual-widget.c
libempathy-gtk/empathy-roster-model-aggregator.c

index 5dc1309839142c6c0bcda24124c97ee2c61070ef..b7b0abe8655adf92203ef2195bbf3a651af1462f 100644 (file)
@@ -129,6 +129,8 @@ individual_menu_add_personas (EmpathyIndividualMenu *self,
       g_clear_object (&persona);
     }
 
+  g_clear_object (&iter);
+
   /* return early if these entries would add nothing beyond the "quick" items */
   if (persona_count <= 1)
     goto out;
@@ -337,11 +339,15 @@ static void
 call_phone_number (FolksPhoneFieldDetails *details,
     TpAccount *account)
 {
-  DEBUG ("Try to call %s", folks_phone_field_details_get_normalised (details));
+  gchar *number;
 
-  empathy_call_new_with_streams (
-      folks_phone_field_details_get_normalised (details),
+  number = folks_phone_field_details_get_normalised (details);
+  DEBUG ("Try to call %s", number);
+
+  empathy_call_new_with_streams (number,
       account, TRUE, FALSE, empathy_get_current_action_time ());
+
+  g_free (number);
 }
 
 static void
@@ -410,6 +416,7 @@ find_phone_type (FolksPhoneFieldDetails *details)
 {
   GeeCollection *types;
   GeeIterator *iter;
+  const gchar *retval = NULL;
 
   types = folks_abstract_field_details_get_parameter_values (
       FOLKS_ABSTRACT_FIELD_DETAILS (details), "type");
@@ -420,17 +427,24 @@ find_phone_type (FolksPhoneFieldDetails *details)
   iter = gee_iterable_iterator (GEE_ITERABLE (types));
   while (gee_iterator_next (iter))
     {
-      const gchar *type = gee_iterator_get (iter);
+      gchar *type = gee_iterator_get (iter);
 
       if (!tp_strdiff (type, "CELL"))
-        return _("Mobile");
+        retval = _("Mobile");
       else if (!tp_strdiff (type, "WORK"))
-        return _("Work");
+        retval = _("Work");
       else if (!tp_strdiff (type, "HOME"))
-        return _("HOME");
+        retval = _("HOME");
+
+      g_free (type);
+
+      if (retval != NULL)
+        break;
     }
 
-  return NULL;
+  g_object_unref (iter);
+
+  return retval;
 }
 
 static void
@@ -451,26 +465,26 @@ add_phone_numbers (EmpathyIndividualMenu *self)
     {
       FolksPhoneFieldDetails *details = gee_iterator_get (iter);
       GtkWidget *item, *image;
-      gchar *tmp;
+      gchar *tmp, *number;
       const gchar *type;
 
       type = find_phone_type (details);
+      number = folks_phone_field_details_get_normalised (details);
 
       if (type != NULL)
         {
           /* translators: first argument is a phone number like +32123456 and
            * the second one is something like 'home' or 'work'. */
-          tmp = g_strdup_printf (_("Call %s (%s)"),
-              folks_phone_field_details_get_normalised (details),
-              type);
+          tmp = g_strdup_printf (_("Call %s (%s)"), number, type);
         }
       else
         {
           /* translators: argument is a phone number like +32123456 */
-          tmp = g_strdup_printf (_("Call %s"),
-              folks_phone_field_details_get_normalised (details));
+          tmp = g_strdup_printf (_("Call %s"), number);
         }
 
+      g_free (number);
+
       item = gtk_image_menu_item_new_with_mnemonic (tmp);
       g_free (tmp);
 
@@ -487,6 +501,8 @@ add_phone_numbers (EmpathyIndividualMenu *self)
 
       gtk_menu_shell_append (GTK_MENU_SHELL (self), item);
       gtk_widget_show (item);
+
+      g_object_unref (details);
     }
 
   g_object_unref (iter);
@@ -510,17 +526,20 @@ get_contacts_supporting_blocking (FolksIndividual *individual)
       TpConnection *conn;
 
       if (!TPF_IS_PERSONA (persona))
-        continue;
+        goto while_next;
 
       contact = tpf_persona_get_contact (persona);
       if (contact == NULL)
-        continue;
+        goto while_next;
 
       conn = tp_contact_get_connection (contact);
 
       if (tp_proxy_has_interface_by_id (conn,
         TP_IFACE_QUARK_CONNECTION_INTERFACE_CONTACT_BLOCKING))
         result = g_list_prepend (result, contact);
+
+while_next:
+      g_clear_object (&persona);
     }
 
   g_clear_object (&iter);
index ca007aaf6ac95e08c592e6db3bf77c53214d3d61..fac2c5a1bd46cf42ecfb0186a083dd4e0c289c35 100644 (file)
@@ -1784,6 +1784,7 @@ personas_changed_cb (FolksIndividual *individual,
 
       g_clear_object (&persona);
     }
+  g_clear_object (&iter);
 
   /*
    * What we display for various conditions:
@@ -1849,6 +1850,7 @@ personas_changed_cb (FolksIndividual *individual,
           add_persona (self, persona);
           g_clear_object (&persona);
         }
+      g_clear_object (&iter);
     }
   else if (was_showing_personas && !will_show_personas)
     {
@@ -1860,6 +1862,7 @@ personas_changed_cb (FolksIndividual *individual,
           remove_persona (self, persona);
           g_clear_object (&persona);
         }
+      g_clear_object (&iter);
 
       if (removed != NULL)
         {
@@ -1878,7 +1881,6 @@ personas_changed_cb (FolksIndividual *individual,
       /* Set up the Individual grid instead */
       individual_grid_set_up (self);
     }
-  g_clear_object (&iter);
 
   /* Hide the last separator and show the others */
   children = gtk_container_get_children (GTK_CONTAINER (priv->vbox_individual));
index 824e35d9e5050945c61b053efd4de4b4b0a0f1c0..26c8f2ae7909c4d585d74fea0f93ab817d301e27 100644 (file)
@@ -175,7 +175,9 @@ populate_individuals (EmpathyRosterModelAggregator *self)
   iter = gee_map_map_iterator (individuals);
   while (gee_map_iterator_next (iter))
     {
-      add_individual (self, gee_map_iterator_get_value (iter));
+      FolksIndividual *individual = gee_map_iterator_get_value (iter);
+      add_individual (self, individual);
+      g_object_unref (individual);
     }
   g_clear_object (&iter);
 }
@@ -195,7 +197,9 @@ aggregator_individuals_changed_cb (FolksIndividualAggregator *aggregator,
 
       while (iter != NULL && gee_iterator_next (iter))
         {
-          add_individual (self, gee_iterator_get (iter));
+          FolksIndividual *individual = gee_iterator_get (iter);
+          add_individual (self, individual);
+          g_object_unref (individual);
         }
       g_clear_object (&iter);
     }
@@ -206,7 +210,9 @@ aggregator_individuals_changed_cb (FolksIndividualAggregator *aggregator,
 
       while (iter != NULL && gee_iterator_next (iter))
         {
-          remove_individual (self, gee_iterator_get (iter));
+          FolksIndividual *individual = gee_iterator_get (iter);
+          remove_individual (self, individual);
+          g_object_unref (individual);
         }
       g_clear_object (&iter);
     }
@@ -405,6 +411,7 @@ empathy_roster_model_aggregator_dup_groups_for_individual (
 
       while (iter != NULL && gee_iterator_next (iter))
         {
+          /* Transfer ownership: */
           groups_list = g_list_prepend (groups_list, gee_iterator_get (iter));
         }
       g_clear_object (&iter);