1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-30 06:46:38 +02:00

irc: fix crash on /upgrade (free channels before server data when a server is destroyed) (bug #37736)

This commit is contained in:
Sebastien Helleu
2012-11-14 20:18:10 +01:00
parent bb09670757
commit f1d6f2c40a
3 changed files with 22 additions and 15 deletions
+4 -2
View File
@@ -838,7 +838,10 @@ irc_channel_free (struct t_irc_server *server, struct t_irc_channel *channel)
if (channel->next_channel)
(channel->next_channel)->prev_channel = channel->prev_channel;
/* free data */
/* free linked lists */
irc_nick_free_all (server, channel);
/* free channel data */
if (channel->name)
free (channel->name);
if (channel->topic)
@@ -847,7 +850,6 @@ irc_channel_free (struct t_irc_server *server, struct t_irc_channel *channel)
free (channel->modes);
if (channel->key)
free (channel->key);
irc_nick_free_all (server, channel);
if (channel->away_message)
free (channel->away_message);
if (channel->pv_remote_nick_color)
+15 -12
View File
@@ -1338,7 +1338,21 @@ irc_server_free_data (struct t_irc_server *server)
if (!server)
return;
/* free data */
/* free linked lists */
for (i = 0; i < IRC_SERVER_NUM_OUTQUEUES_PRIO; i++)
{
irc_server_outqueue_free_all (server, i);
}
irc_redirect_free_all (server);
irc_notify_free_all (server);
irc_channel_free_all (server);
/* free hashtables */
weechat_hashtable_free (server->join_manual);
weechat_hashtable_free (server->join_channel_key);
weechat_hashtable_free (server->join_noswitch);
/* free server data */
for (i = 0; i < IRC_SERVER_NUM_OPTIONS; i++)
{
if (server->options[i])
@@ -1389,17 +1403,6 @@ irc_server_free_data (struct t_irc_server *server)
regfree (server->cmd_list_regexp);
free (server->cmd_list_regexp);
}
for (i = 0; i < IRC_SERVER_NUM_OUTQUEUES_PRIO; i++)
{
irc_server_outqueue_free_all (server, i);
}
irc_notify_free_all (server);
weechat_hashtable_free (server->join_manual);
weechat_hashtable_free (server->join_channel_key);
weechat_hashtable_free (server->join_noswitch);
irc_redirect_free_all (server);
if (server->channels)
irc_channel_free_all (server);
if (server->buffer_as_string)
free (server->buffer_as_string);
}