Fix crash in log_custom when the network is disconnected.
authorJelmer Vernooij <jelmer@samba.org>
Mon, 13 Apr 2009 17:36:33 +0000 (19:36 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 13 Apr 2009 17:36:33 +0000 (19:36 +0200)
NEWS
src/log_custom.c

diff --git a/NEWS b/NEWS
index 091accd465d5c4b07c513692134832fd388e56e8..6dffc1ffecbd0db65a67d854e10ab6d90b0d2829 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -22,6 +22,8 @@ Ctrlproxy 3.0.9 UNRELEASED
 
        * Fix crash in on_transport_log when no error is set. (#219)
 
+    * Fix crash in log_custom when the network is disconnected. (#212)
+
   FEATURES
 
     * Provide Python bindings for the main library code. Mainly used for 
index 6c43cd6a89aa93b51477c6584f6ef4929200683f..24acf66790e7c6d3089c4b7563ba806c62bdfeb5 100644 (file)
 
 #include "internals.h"
 
+static struct irc_network_info *network_get_info(struct irc_network *network)
+{
+
+       if (network->external_state == NULL || network->external_state->info == NULL)
+               return NULL;
+       else
+               return network->external_state->info;
+}
+
 struct log_custom_data {
        struct log_file_config *config;
        struct log_support_context *log_ctx;
@@ -100,16 +109,19 @@ static void file_write_target(struct log_custom_data *data,
                                                          const struct irc_line *l) 
 {
        char *t;
+       struct irc_network_info *info;
        
        if (fmt == NULL) 
                return;
        
        g_assert(l->args[0] != NULL);
        g_assert(l->args[1] != NULL);
-       g_assert(network->external_state != NULL);
+       info = network_get_info(network);
        g_assert(network->external_state->me.nick != NULL);
 
-       if (!irccmp(network->external_state->info, network->external_state->me.nick, l->args[1])) {
+       if (network->external_state != NULL && 
+               network->external_state->me.nick != NULL &&
+               !irccmp(info, network->external_state->me.nick, l->args[1])) {
                if (l->origin != NULL)
                        t = line_get_nick(l);
                else 
@@ -144,6 +156,9 @@ static void file_write_channel_query(struct log_custom_data *data,
        if (fmt == NULL) 
                return;
 
+       if (network->external_state == NULL)
+               return;
+
        /* check for the query first */
        nick = line_get_nick(l);
        
@@ -209,7 +224,7 @@ static gboolean log_custom_data(struct irc_network *network,
        } else if (!g_strcasecmp(l->args[0], "NOTICE")) {
                file_write_target(data, network, data->config->notice, l);
        } else if (!g_strcasecmp(l->args[0], "MODE") && l->args[1] != NULL && 
-                         is_channelname(l->args[1], network->external_state->info) && 
+                         is_channelname(l->args[1], network_get_info(network)) && 
                          dir == FROM_SERVER) {
                file_write_target(data, network, data->config->mode, l);
        } else if (!g_strcasecmp(l->args[0], "QUIT")) {