diff --git a/src/core/server.c b/src/core/server.c index 724f0d1c..33e79856 100644 --- a/src/core/server.c +++ b/src/core/server.c @@ -229,6 +229,8 @@ void server_disconnect(SERVER_REC *server) if (server->handle != NULL) net_sendbuffer_destroy(server->handle, TRUE); + if (server->readtag > 0) + g_source_remove(server->readtag); MODULE_DATA_DEINIT(server); rawlog_destroy(server->rawlog); diff --git a/src/fe-common/irc/irc-completion.c b/src/fe-common/irc/irc-completion.c index 401984e2..82025dfb 100644 --- a/src/fe-common/irc/irc-completion.c +++ b/src/fe-common/irc/irc-completion.c @@ -574,6 +574,9 @@ static void completion_deinit_server(IRC_SERVER_REC *server) { g_return_if_fail(server != NULL); + if (!irc_server_check(server)) + return; + g_slist_foreach(server->lastmsgs, (GFunc) g_free, NULL); g_slist_free(server->lastmsgs); } diff --git a/src/irc/core/channel-rejoin.c b/src/irc/core/channel-rejoin.c index 89abae0c..b255e228 100644 --- a/src/irc/core/channel-rejoin.c +++ b/src/irc/core/channel-rejoin.c @@ -59,6 +59,9 @@ static void event_target_unavailable(const char *data, IRC_SERVER_REC *server) static void sig_disconnected(IRC_SERVER_REC *server) { + if (!irc_server_check(server)) + return; + g_slist_foreach(server->rejoin_channels, (GFunc) g_free, NULL); g_slist_free(server->rejoin_channels); } diff --git a/src/irc/core/channels-query.c b/src/irc/core/channels-query.c index 95ab9ecd..2070e979 100644 --- a/src/irc/core/channels-query.c +++ b/src/irc/core/channels-query.c @@ -73,7 +73,8 @@ static void sig_connected(IRC_SERVER_REC *server) SERVER_QUERY_REC *rec; g_return_if_fail(server != NULL); - if (!irc_server_check(server)) return; + if (!irc_server_check(server)) + return; rec = g_new0(SERVER_QUERY_REC, 1); server->chanqueries = rec; @@ -85,7 +86,8 @@ static void sig_disconnected(IRC_SERVER_REC *server) int n; g_return_if_fail(server != NULL); - if (!irc_server_check(server)) return; + if (!irc_server_check(server)) + return; rec = server->chanqueries; g_return_if_fail(rec != NULL); diff --git a/src/irc/core/ctcp.c b/src/irc/core/ctcp.c index 7daee3d9..c3173cb7 100644 --- a/src/irc/core/ctcp.c +++ b/src/irc/core/ctcp.c @@ -182,10 +182,13 @@ static void event_notice(const char *data, IRC_SERVER_REC *server, const char *n g_free(params); } -static void ctcp_deinit_server(IRC_SERVER_REC *server) +static void sig_disconnected(IRC_SERVER_REC *server) { g_return_if_fail(server != NULL); + if (!irc_server_check(server)) + return; + g_slist_free(server->ctcpqueue); } @@ -194,7 +197,7 @@ void ctcp_init(void) settings_add_str("misc", "ctcp_version_reply", PACKAGE" v$J - running on $sysname"); settings_add_int("flood", "max_ctcp_queue", 5); - signal_add("server disconnected", (SIGNAL_FUNC) ctcp_deinit_server); + signal_add("server disconnected", (SIGNAL_FUNC) sig_disconnected); signal_add_first("event privmsg", (SIGNAL_FUNC) event_privmsg); signal_add_first("event notice", (SIGNAL_FUNC) event_notice); signal_add("ctcp msg", (SIGNAL_FUNC) ctcp_msg); @@ -206,7 +209,7 @@ void ctcp_init(void) void ctcp_deinit(void) { - signal_remove("server disconnected", (SIGNAL_FUNC) ctcp_deinit_server); + signal_remove("server disconnected", (SIGNAL_FUNC) sig_disconnected); signal_remove("event privmsg", (SIGNAL_FUNC) event_privmsg); signal_remove("event notice", (SIGNAL_FUNC) event_notice); signal_remove("ctcp msg", (SIGNAL_FUNC) ctcp_msg); diff --git a/src/irc/core/irc-commands.c b/src/irc/core/irc-commands.c index e1c1d317..323d922b 100644 --- a/src/irc/core/irc-commands.c +++ b/src/irc/core/irc-commands.c @@ -913,6 +913,9 @@ static void sig_server_disconnected(IRC_SERVER_REC *server) { g_return_if_fail(server != NULL); + if (!irc_server_check(server)) + return; + while (server->knockoutlist != NULL) knockout_destroy(server, server->knockoutlist->data); } diff --git a/src/irc/core/irc.c b/src/irc/core/irc.c index c58b5db1..692f5346 100644 --- a/src/irc/core/irc.c +++ b/src/irc/core/irc.c @@ -350,14 +350,6 @@ static void irc_init_server(IRC_SERVER_REC *server) (GInputFunction) irc_parse_incoming, server); } -static void irc_deinit_server(IRC_SERVER_REC *server) -{ - g_return_if_fail(server != NULL); - - if (server->readtag > 0) - g_source_remove(server->readtag); -} - #define isoptchan(a) \ (ischannel((a)[0]) || ((a)[0] == '*' && ((a)[1] == '\0' || (a)[1] == ' '))) @@ -400,7 +392,6 @@ void irc_irc_init(void) signal_add("server event", (SIGNAL_FUNC) irc_server_event); signal_add("server connected", (SIGNAL_FUNC) irc_init_server); - signal_add_first("server disconnected", (SIGNAL_FUNC) irc_deinit_server); signal_add("server incoming", (SIGNAL_FUNC) irc_parse_incoming_line); current_server_event = NULL; @@ -414,7 +405,6 @@ void irc_irc_deinit(void) { signal_remove("server event", (SIGNAL_FUNC) irc_server_event); signal_remove("server connected", (SIGNAL_FUNC) irc_init_server); - signal_remove("server disconnected", (SIGNAL_FUNC) irc_deinit_server); signal_remove("server incoming", (SIGNAL_FUNC) irc_parse_incoming_line); module_uniq_destroy("IRC"); diff --git a/src/irc/core/netsplit.c b/src/irc/core/netsplit.c index 6fec71a5..78f1f02c 100644 --- a/src/irc/core/netsplit.c +++ b/src/irc/core/netsplit.c @@ -284,6 +284,9 @@ static void sig_disconnected(IRC_SERVER_REC *server) { g_return_if_fail(server != NULL); + if (!irc_server_check(server)) + return; + g_hash_table_foreach(server->splits, (GHFunc) netsplit_destroy_hash, server); g_hash_table_destroy(server->splits); } diff --git a/src/irc/core/server-idle.c b/src/irc/core/server-idle.c index 74e1164a..1f4b7858 100644 --- a/src/irc/core/server-idle.c +++ b/src/irc/core/server-idle.c @@ -217,6 +217,9 @@ static void sig_disconnected(IRC_SERVER_REC *server) { g_return_if_fail(server != NULL); + if (!irc_server_check(server)) + return; + while (server->idles != NULL) server_idle_destroy(server, server->idles->data); }