Skip to content

Commit

Permalink
[cwave:r51] Fix memory leak by registering a mod->free handler in mod…
Browse files Browse the repository at this point in the history
…_roster, rename _roster_free() to _roster_freeuser() to make room for a new _roster_free()
  • Loading branch information
smokku committed Dec 15, 2009
1 parent 49c1302 commit 1da3f1a
Showing 1 changed file with 13 additions and 6 deletions.
19 changes: 13 additions & 6 deletions sm/mod_roster.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ typedef struct _roster_walker_st {
} *roster_walker_t;

/** free a single roster item */
static void _roster_free_walker(const char *key, void *val, void *arg)
static void _roster_freeuser_walker(const char *key, void *val, void *arg)
{
item_t item = (item_t) val;
int i;
Expand All @@ -57,14 +57,14 @@ static void _roster_free_walker(const char *key, void *val, void *arg)
}

/** free the roster */
static void _roster_free(user_t user)
static void _roster_freeuser(user_t user)
{
if(user->roster == NULL)
return;

log_debug(ZONE, "freeing roster for %s", jid_user(user->jid));

xhash_walk(user->roster, _roster_free_walker, NULL);
xhash_walk(user->roster, _roster_freeuser_walker, NULL);

xhash_free(user->roster);
user->roster = NULL;
Expand Down Expand Up @@ -348,7 +348,7 @@ static void _roster_set_item(pkt_t pkt, int elem, sess_t sess, mod_instance_t mi

/* kill it */
xhash_zap(sess->user->roster, jid_full(jid));
_roster_free_walker((const char *) jid_full(jid), (void *) item, NULL);
_roster_freeuser_walker((const char *) jid_full(jid), (void *) item, NULL);

snprintf(filter, 4096, "(jid=%zu:%s)", strlen(jid_full(jid)), jid_full(jid));
storage_delete(sess->user->sm->st, "roster-items", jid_user(sess->jid), filter);
Expand Down Expand Up @@ -764,7 +764,7 @@ static int _roster_user_load(mod_instance_t mi, user_t user) {
if(olditem) {
log_debug(ZONE, "removing old %s roster entry", jid_full(item->jid));
xhash_zap(user->roster, jid_full(item->jid));
_roster_free_walker(jid_full(item->jid), (void *) olditem, NULL);
_roster_freeuser_walker(jid_full(item->jid), (void *) olditem, NULL);
}

/* its good */
Expand Down Expand Up @@ -801,7 +801,7 @@ static int _roster_user_load(mod_instance_t mi, user_t user) {
os_free(os);
}

pool_cleanup(user->p, (void (*))(void *) _roster_free, user);
pool_cleanup(user->p, (void (*))(void *) _roster_freeuser, user);

return 0;
}
Expand All @@ -813,6 +813,12 @@ static void _roster_user_delete(mod_instance_t mi, jid_t jid) {
storage_delete(mi->sm->st, "roster-groups", jid_user(jid), NULL);
}

static void _roster_free(module_t mod)
{
mod_roster_t mroster = (mod_roster_t) mod->private;
free(mroster);
}

DLLEXPORT int module_init(mod_instance_t mi, char *arg) {
module_t mod = mi->mod;
mod_roster_t mroster;
Expand All @@ -829,6 +835,7 @@ DLLEXPORT int module_init(mod_instance_t mi, char *arg) {
mod->pkt_user = _roster_pkt_user;
mod->user_load = _roster_user_load;
mod->user_delete = _roster_user_delete;
mod->free = _roster_free;

feature_register(mod->mm->sm, uri_ROSTER);

Expand Down

0 comments on commit 1da3f1a

Please sign in to comment.