diff options
author | Michael Vetter <jubalh@iodoru.org> | 2019-07-08 15:58:40 +0200 |
---|---|---|
committer | Michael Vetter <jubalh@iodoru.org> | 2019-07-08 15:58:40 +0200 |
commit | b3bb62dcbdac29ebe1669419a86da060d5be619b (patch) | |
tree | 07d5d472e3088d2bab243b2f11e4f5e7aebfc593 | |
parent | 63552720916dbe82cdb001eee74b7c08723b823a (diff) | |
download | profani-tty-b3bb62dcbdac29ebe1669419a86da060d5be619b.tar.gz |
Fix double free regarding iq handlers
-rw-r--r-- | src/xmpp/iq.c | 18 |
1 files changed, 4 insertions, 14 deletions
diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c index e31f3269..23048b8d 100644 --- a/src/xmpp/iq.c +++ b/src/xmpp/iq.c @@ -214,7 +214,6 @@ _iq_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const us if (handler) { int keep = handler->func(stanza, handler->userdata); if (!keep) { - free(handler); g_hash_table_remove(id_handlers, id); } } @@ -235,19 +234,8 @@ iq_handlers_init(void) xmpp_timed_handler_add(conn, _autoping_timed_send, millis, ctx); } - if (id_handlers) { - GList *keys = g_hash_table_get_keys(id_handlers); - GList *curr = keys; - while (curr) { - ProfIqHandler *handler = g_hash_table_lookup(id_handlers, curr->data); - if (handler->free_func && handler->userdata) { - handler->free_func(handler->userdata); - } - curr = g_list_next(curr); - } - g_list_free(keys); - g_hash_table_destroy(id_handlers); - } + iq_handlers_clear(); + id_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)_iq_id_handler_free); rooms_cache = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)xmpp_stanza_release); } @@ -257,6 +245,7 @@ iq_handlers_clear() { if (id_handlers) { g_hash_table_remove_all(id_handlers); + id_handlers = NULL; } } @@ -344,6 +333,7 @@ iq_rooms_cache_clear(void) { if (rooms_cache) { g_hash_table_remove_all(rooms_cache); + rooms_cache = NULL; } } |