diff --git a/src/server/net.c b/src/server/net.c index 9c0468ee6679d9674af255d9bf72d27a46a09576..33bf5014156e133105a794f2426228795fa9311c 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -103,14 +103,20 @@ static gboolean net_push_userlist_cb(gpointer data) struct con_data *c; + gchar **msgs; gchar *buf; gchar *tmp; + gint i; + gint msgcnt = 0; + gchar *msg = NULL; g_mutex_lock(&listlock); + msgs = g_malloc(g_list_length(con_list) * sizeof(gchar *)); + for (elem = con_list; elem; elem = elem->next) { c = (struct con_data *) elem->data; @@ -132,22 +138,27 @@ static gboolean net_push_userlist_cb(gpointer data) if (c->new) { c->new = FALSE; - buf = g_strdup_printf("<tt><span foreground='#F1C40F'>" - "%s</span></tt> joined", - c->nick); + msgs[msgcnt++] = g_strdup_printf("<tt><span foreground='#F1C40F'>" + "%s</span></tt> joined", + c->nick); - net_server_broadcast_message(buf, NULL); - g_free(buf); } } + g_mutex_unlock(&listlock); + + for (i = 0; i < msgcnt; i++) { + net_server_broadcast_message(msgs[i], NULL); + g_free(msgs[i]); + } + + g_free(msgs); if (msg) { ack_userlist(PKT_TRANS_ID_UNDEF, (guchar *) msg, strlen(msg)); g_free(msg); } - g_mutex_unlock(&listlock); return G_SOURCE_REMOVE; } @@ -526,8 +537,6 @@ drop_pkt: ret = g_buffered_input_stream_fill_finish(bistream, res, &error); - g_object_unref(c->con); - if (ret < 0) goto error; @@ -542,8 +551,6 @@ exit: if (!G_IS_OBJECT(c->con)) return; - g_object_ref(c->con); - /* continue buffering */ g_buffered_input_stream_fill_async(bistream, g_buffered_input_stream_get_buffer_size(bistream), @@ -555,6 +562,8 @@ exit: error: + /* drop ref from begin_reception() */ + g_object_unref(c->con); g_message("Error occured in %s, initiating connection drop", __func__); if (error) {