Fix multiple channel links to one destination channel giving segfault and also make...
authorMartin Johansson <martin@fatbob.nu>
Tue, 16 Dec 2014 21:48:58 +0000 (22:48 +0100)
committerMartin Johansson <martin@fatbob.nu>
Tue, 16 Dec 2014 21:48:58 +0000 (22:48 +0100)
src/channel.c
src/channel.h
src/client.c
src/messagehandler.c

index 54b57a27a21421da214b04d53c8c3d7b05c28af3..3a5fac02c41ffc70032798e7da3ca49ab870b8d9 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.");
@@ -220,8 +221,11 @@ void Chan_init()
                                          chlink.destination);
                else
                        ch_dst = ch_itr;
-
-               list_add_tail(&ch_dst->link_node, &ch_src->channel_links);
+               
+               chl = malloc(sizeof(channellist_t));
+               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 +234,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 +245,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);
        }
 }
index 44a1b5fed519b9e2b21ad8a9321cd693d15ee471..d348184f8ccf9602268a49828270999779444af3 100644 (file)
@@ -49,7 +49,6 @@ typedef struct channel {
        struct dlist flatlist_node;
        struct dlist channel_links;
        int linkcount;
-       struct dlist link_node;
 } channel_t;
 
 typedef struct {
index 526e1f4bf5f2fc35cee0b33e10dd5ecfba2e3d90..79a143ee02190dddbff8e78f233357db3314f264 100644 (file)
@@ -958,8 +958,10 @@ int Client_voiceMsg(client_t *client, uint8_t *data, int len)
                        if (vt->channels[i].linked && !list_empty(&ch->channel_links)) {
                                struct dlist *ch_itr;
                                list_iterate(ch_itr, &ch->channel_links) {
+                                       channellist_t *chl;
                                        channel_t *ch_link;
-                                       ch_link = list_get_entry(ch_itr, channel_t, link_node);
+                                       chl = list_get_entry(ch_itr, channellist_t, node);
+                                       ch_link = chl->chan;
                                        list_iterate(itr, &ch_link->clients) {
                                                client_t *c;
                                                c = list_get_entry(itr, client_t, chan_node);
index 696cad3c6d750f90f642ee2c5aa734b07b9f0be1..6adcf774dd1de57863a02f7a41091cf24970a528 100644 (file)
@@ -286,8 +286,10 @@ void Mh_handle_message(client_t *client, message_t *msg)
 
                                links = (uint32_t *)malloc(ch_itr->linkcount * sizeof(uint32_t));
                                list_iterate(itr, &ch_itr->channel_links) { /* Iterate links */
+                                       channellist_t *chl;
                                        channel_t *ch;
-                                       ch = list_get_entry(itr, channel_t, link_node);
+                                       chl = list_get_entry(itr, channellist_t, node);
+                                       ch = chl->chan;
                                        links[i++] = ch->id;
                                }
                                sendmsg->payload.channelState->links = links;