From d53d3911ebf68f70e39d0cd660af7aac923127cb Mon Sep 17 00:00:00 2001 From: Martin Johansson Date: Tue, 16 Dec 2014 22:48:58 +0100 Subject: [PATCH] Fix multiple channel links to one destination channel giving segfault and also make it work. --- src/channel.c | 14 ++++++++++++-- src/channel.h | 1 - src/client.c | 4 +++- src/messagehandler.c | 4 +++- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/channel.c b/src/channel.c index 54b57a2..3a5fac0 100644 --- a/src/channel.c +++ b/src/channel.c @@ -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); } } diff --git a/src/channel.h b/src/channel.h index 44a1b5f..d348184 100644 --- a/src/channel.h +++ b/src/channel.h @@ -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 { diff --git a/src/client.c b/src/client.c index 526e1f4..79a143e 100644 --- a/src/client.c +++ b/src/client.c @@ -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); diff --git a/src/messagehandler.c b/src/messagehandler.c index 696cad3..6adcf77 100644 --- a/src/messagehandler.c +++ b/src/messagehandler.c @@ -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; -- 2.30.2