kike: fix leaking of channels

This commit is contained in:
Přemysl Eric Janouch 2014-08-09 23:20:21 +02:00
parent 71ff29ae89
commit 9927956104
1 changed files with 10 additions and 13 deletions

View File

@ -370,10 +370,10 @@ struct channel
struct str_vector invite_list; ///< Exceptions from +I struct str_vector invite_list; ///< Exceptions from +I
}; };
static void static struct channel *
channel_init (struct channel *self) channel_new (void)
{ {
memset (self, 0, sizeof *self); struct channel *self = xcalloc (1, sizeof *self);
self->user_limit = -1; self->user_limit = -1;
self->topic = xstrdup (""); self->topic = xstrdup ("");
@ -381,10 +381,11 @@ channel_init (struct channel *self)
str_vector_init (&self->ban_list); str_vector_init (&self->ban_list);
str_vector_init (&self->exception_list); str_vector_init (&self->exception_list);
str_vector_init (&self->invite_list); str_vector_init (&self->invite_list);
return self;
} }
static void static void
channel_free (struct channel *self) channel_delete (struct channel *self)
{ {
free (self->name); free (self->name);
free (self->key); free (self->key);
@ -400,6 +401,8 @@ channel_free (struct channel *self)
str_vector_free (&self->ban_list); str_vector_free (&self->ban_list);
str_vector_free (&self->exception_list); str_vector_free (&self->exception_list);
str_vector_free (&self->invite_list); str_vector_free (&self->invite_list);
free (self);
} }
static char * static char *
@ -466,9 +469,9 @@ server_context_init (struct server_context *self)
str_map_init (&self->users); str_map_init (&self->users);
self->users.key_xfrm = irc_strxfrm; self->users.key_xfrm = irc_strxfrm;
// TODO: set channel_free() as the free function?
str_map_init (&self->channels); str_map_init (&self->channels);
self->channels.key_xfrm = irc_strxfrm; self->channels.key_xfrm = irc_strxfrm;
self->channels.free = (void (*) (void *)) channel_delete;
str_map_init (&self->handlers); str_map_init (&self->handlers);
self->handlers.key_xfrm = irc_strxfrm; self->handlers.key_xfrm = irc_strxfrm;
@ -587,12 +590,10 @@ channel_user_count (const struct channel *chan)
static struct channel * static struct channel *
channel_create (struct server_context *ctx, const char *name) channel_create (struct server_context *ctx, const char *name)
{ {
struct channel *chan = xcalloc (1, sizeof *chan); struct channel *chan = channel_new ();
channel_init (chan);
str_map_set (&ctx->channels, name, chan);
chan->ctx = ctx; chan->ctx = ctx;
chan->name = xstrdup (name); chan->name = xstrdup (name);
str_map_set (&ctx->channels, name, chan);
return chan; return chan;
} }
@ -600,11 +601,7 @@ static void
channel_destroy_if_empty (struct server_context *ctx, struct channel *chan) channel_destroy_if_empty (struct server_context *ctx, struct channel *chan)
{ {
if (!chan->users) if (!chan->users)
{
str_map_set (&ctx->channels, chan->name, NULL); str_map_set (&ctx->channels, chan->name, NULL);
channel_free (chan);
free (chan);
}
} }
// --- Clients ----------------------------------------------------------------- // --- Clients -----------------------------------------------------------------