changeset 2222:ce1043326bbc

Fix a small leak when a window is closed Also, fix a segfault when buffer close is called with a non-lowercase JID...
author Mikael Berthe <mikael@lilotux.net>
date Fri, 06 Nov 2015 20:33:31 +0100
parents 3f9988ec21e0
children 965e0282c128
files mcabber/mcabber/screen.c
diffstat 1 files changed, 15 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/mcabber/screen.c	Fri Nov 06 19:46:48 2015 +0100
+++ b/mcabber/mcabber/screen.c	Fri Nov 06 20:33:31 2015 +0100
@@ -1709,7 +1709,8 @@
 
   if (fullinit) {
     if (!winbufhash)
-      winbufhash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+      winbufhash = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                         g_free, g_free);
     /* Create windows */
     rosterWnd = newwin(CHAT_WIN_HEIGHT, Roster_Width, chat_y_pos, roster_x_pos);
     chatWnd   = newwin(CHAT_WIN_HEIGHT, maxX - Roster_Width, chat_y_pos,
@@ -2858,6 +2859,7 @@
 // value: winbuf structure
 // data: int, set to 1 if the buffer should be closed.
 // NOTE: does not work for special buffers.
+// Returns TRUE IFF the win_entry can be closed and freed.
 static gboolean buffer_purge(gpointer key, gpointer value, gpointer data)
 {
   int *p_closebuf = data;
@@ -2888,13 +2890,15 @@
 {
   winbuf *win_entry;
   guint isspe;
-  guint *p_closebuf;
   const char *cjid;
+  char *ljid = NULL;
   guint hold_chatmode = FALSE;
 
   if (jid) {
-    cjid = jid;
     isspe = FALSE;
+    ljid = g_strdup(jid);
+    mc_strtolower(ljid);
+    cjid = ljid;
     // If closebuf is TRUE, it's probably better not to leave chat mode
     // if the change isn't related to the current buffer.
     if (closebuf && current_buddy) {
@@ -2909,15 +2913,15 @@
     isspe = buddy_gettype(BUDDATA(current_buddy)) & ROSTER_TYPE_SPECIAL;
   }
   win_entry = scr_search_window(cjid, isspe);
-  if (!win_entry) return;
+  if (!win_entry) {
+    g_free(ljid);
+    return;
+  }
 
   if (!isspe) {
-    p_closebuf = g_new(guint, 1);
-    *p_closebuf = closebuf;
-    if(buffer_purge((gpointer)cjid, win_entry, p_closebuf))
+    if (buffer_purge((gpointer)cjid, win_entry, &closebuf))
       g_hash_table_remove(winbufhash, cjid);
     roster_msg_setflag(cjid, FALSE, FALSE);
-    g_free(p_closebuf);
     if (closebuf && !hold_chatmode) {
       scr_set_chatmode(FALSE);
       currentWindow = NULL;
@@ -2941,6 +2945,8 @@
 
   // Finished :)
   update_panels();
+
+  g_free(ljid);
 }
 
 //  scr_buffer_purge_all(closebuf)
@@ -2948,12 +2954,7 @@
 // If closebuf is 1, the buffers are closed.
 void scr_buffer_purge_all(int closebuf)
 {
-  guint *p_closebuf;
-  p_closebuf = g_new(guint, 1);
-
-  *p_closebuf = closebuf;
-  g_hash_table_foreach_remove(winbufhash, buffer_purge, p_closebuf);
-  g_free(p_closebuf);
+  g_hash_table_foreach_remove(winbufhash, buffer_purge, &closebuf);
 
   if (closebuf) {
     scr_set_chatmode(FALSE);