diff mcabber/src/screen.c @ 1072:2a3cfb98bd5e

Fix memory leaks after calls to buddy_getresources()
author Mikael Berthe <mikael@lilotux.net>
date Sun, 03 Dec 2006 19:29:50 +0100
parents 875d2c9d399c
children 03bc225ad763
line wrap: on
line diff
--- a/mcabber/src/screen.c	Sun Dec 03 12:00:17 2006 +0100
+++ b/mcabber/src/screen.c	Sun Dec 03 19:29:50 2006 +0100
@@ -1075,9 +1075,14 @@
 
   // No status message for groups & MUC rooms
   if (!isgrp && !ismuc) {
-    GSList *resources = buddy_getresources(BUDDATA(current_buddy));
+    GSList *resources, *p_res;
+    resources = buddy_getresources(BUDDATA(current_buddy));
     msg = buddy_getstatusmsg(BUDDATA(current_buddy),
                              resources ? resources->data : "");
+    // Free the resources list data
+    for (p_res = resources ; p_res ; p_res = g_slist_next(p_res))
+      g_free(p_res->data);
+    g_slist_free(resources);
   } else if (ismuc) {
     msg = buddy_gettopic(BUDDATA(current_buddy));
   }
@@ -1200,7 +1205,7 @@
   for (i=0; i<maxy && buddy; buddy = g_list_next(buddy)) {
     unsigned short bflags, btype, ismsg, isgrp, ismuc, ishid, isspe;
     gchar *rline_locale;
-    GSList *resources;
+    GSList *resources, *p_res;
 
     bflags = buddy_getflags(BUDDATA(buddy));
     btype = buddy_gettype(BUDDATA(buddy));
@@ -1220,16 +1225,16 @@
     pending = ' ';
 
     resources = buddy_getresources(BUDDATA(buddy));
-    for ( ; resources ; resources = g_slist_next(resources) ) {
+    for (p_res = resources ; p_res ; p_res = g_slist_next(p_res)) {
       guint events = buddy_resource_getevents(BUDDATA(buddy),
-                                              resources ? resources->data : "");
-      if (events & ROSTER_EVENT_PAUSED)
+                                              p_res ? p_res->data : "");
+      if ((events & ROSTER_EVENT_PAUSED) && pending != '+')
         pending = '.';
-      if (events & ROSTER_EVENT_COMPOSING) {
+      if (events & ROSTER_EVENT_COMPOSING)
         pending = '+';
-        break;
-      }
+      g_free(p_res->data);
     }
+    g_slist_free(resources);
 
     // Display message notice if there is a message flag, but not
     // for unfolded groups.