Fixed mutiple possible null-pointer derefences #63
[umurmur.git] / src / channel.c
index 54b57a27a21421da214b04d53c8c3d7b05c28af3..fdf4e82df9acab3a9597b56b5449d13508068b23 100644 (file)
@@ -196,6 +196,7 @@ void Chan_init()
        /* Channel links */
        for (i = 0; ; i++) {
                channel_t *ch_src, *ch_dst, *ch_itr = NULL;
+               channellist_t *chl;
                if (Conf_getNextChannelLink(&chlink, i) < 0) {
                        if (i == 0)
                                Log_info("No channel links found in configuration file.");
@@ -221,7 +222,12 @@ void Chan_init()
                else
                        ch_dst = ch_itr;
 
-               list_add_tail(&ch_dst->link_node, &ch_src->channel_links);
+               chl = malloc(sizeof(channellist_t));
+               if(!chl)
+                       Log_fatal("Out of memory");
+               chl->chan = ch_dst;
+               init_list_entry(&chl->node);
+               list_add_tail(&chl->node, &ch_src->channel_links);
                ch_src->linkcount++;
                Log_info("Adding channel link '%s' -> '%s'", ch_src->name, ch_dst->name);
        }
@@ -230,6 +236,7 @@ void Chan_init()
 void Chan_free()
 {
        struct dlist *itr, *save;
+       struct dlist *linkitr, *linksave;
        channel_t *ch;
 
        list_iterate_safe(itr, save, &channels) {
@@ -240,6 +247,11 @@ void Chan_free()
                        free(ch->desc);
                if (ch->password)
                        free(ch->password);
+               list_iterate_safe(linkitr, linksave, &ch->channel_links) {
+                       channellist_t *chl;
+                       chl = list_get_entry(linkitr, channellist_t, node);
+                       free(chl);
+               }
                free(ch);
        }
 }
@@ -371,6 +383,8 @@ void Chan_buildTreeList(channel_t *ch, struct dlist *head)
        channel_t *sub;
 
        chl = malloc(sizeof(channellist_t));
+       if(!chl)
+               Log_fatal("Out of memory");
        chl->chan = ch;
        init_list_entry(&chl->node);
        list_add_tail(&chl->node, head);