comparison mcabber/src/roster.c @ 246:57f9005b8844

[/trunk] Changeset 259 by mikael * Fix a bug (segfault on buddy deletion) introduced when I added unread_list
author mikael
date Tue, 14 Jun 2005 19:37:11 +0000
parents 72fd1273f2b7
children 49e9e02dd6d0
comparison
equal deleted inserted replaced
245:7ca7ca850270 246:57f9005b8844
165 void roster_del_user(const char *jid) 165 void roster_del_user(const char *jid)
166 { 166 {
167 GSList *sl_user, *sl_group; 167 GSList *sl_user, *sl_group;
168 GSList **sl_group_listptr; 168 GSList **sl_group_listptr;
169 roster *roster_usr; 169 roster *roster_usr;
170 GSList *node;
170 171
171 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); 172 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
172 if (sl_user == NULL) 173 if (sl_user == NULL)
173 return; 174 return;
174 // Let's free memory (jid, name)
175 roster_usr = (roster*)sl_user->data; 175 roster_usr = (roster*)sl_user->data;
176
177 // Remove (if present) from unread messages list
178 node = g_slist_find(unread_list, roster_usr);
179 if (node) unread_list = g_slist_delete_link(unread_list, node);
180
181 // Let's free memory (jid, name, status message)
176 if (roster_usr->jid) g_free((gchar*)roster_usr->jid); 182 if (roster_usr->jid) g_free((gchar*)roster_usr->jid);
177 if (roster_usr->name) g_free((gchar*)roster_usr->name); 183 if (roster_usr->name) g_free((gchar*)roster_usr->name);
178 if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg); 184 if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg);
179 g_free(roster_usr); 185 g_free(roster_usr);
180
181 // Remove (if present) from unread messages list
182 unread_list = g_slist_delete_link(unread_list, sl_user);
183 186
184 // That's a little complex, we need to dereference twice 187 // That's a little complex, we need to dereference twice
185 sl_group = ((roster*)sl_user->data)->list; 188 sl_group = ((roster*)sl_user->data)->list;
186 sl_group_listptr = &((roster*)(sl_group->data))->list; 189 sl_group_listptr = &((roster*)(sl_group->data))->list;
187 *sl_group_listptr = g_slist_delete_link(*sl_group_listptr, sl_user); 190 *sl_group_listptr = g_slist_delete_link(*sl_group_listptr, sl_user);