1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-11-03 19:37:16 -05:00

Merge pull request #1149 from profanity-im/fix/1148-segfault

Fix double free regarding iq handlers
This commit is contained in:
Michael Vetter 2019-07-09 15:48:47 +02:00 committed by GitHub
commit 80ac245b89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 6 additions and 20 deletions

View File

@ -214,7 +214,6 @@ _iq_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const us
if (handler) { if (handler) {
int keep = handler->func(stanza, handler->userdata); int keep = handler->func(stanza, handler->userdata);
if (!keep) { if (!keep) {
free(handler);
g_hash_table_remove(id_handlers, id); 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); xmpp_timed_handler_add(conn, _autoping_timed_send, millis, ctx);
} }
if (id_handlers) { iq_handlers_clear();
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);
}
id_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)_iq_id_handler_free); 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); 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) { if (id_handlers) {
g_hash_table_remove_all(id_handlers); g_hash_table_remove_all(id_handlers);
id_handlers = NULL;
} }
} }
@ -344,6 +333,7 @@ iq_rooms_cache_clear(void)
{ {
if (rooms_cache) { if (rooms_cache) {
g_hash_table_remove_all(rooms_cache); g_hash_table_remove_all(rooms_cache);
rooms_cache = NULL;
} }
} }
@ -2079,8 +2069,6 @@ _room_info_response_id_handler(xmpp_stanza_t *const stanza, void *const userdata
mucwin_room_info_error(mucwin, error_message); mucwin_room_info_error(mucwin, error_message);
free(error_message); free(error_message);
} }
free(cb_data->room);
free(cb_data);
return 0; return 0;
} }
@ -2146,9 +2134,6 @@ _room_info_response_id_handler(xmpp_stanza_t *const stanza, void *const userdata
g_slist_free_full(identities, (GDestroyNotify)_identity_destroy); g_slist_free_full(identities, (GDestroyNotify)_identity_destroy);
} }
free(cb_data->room);
free(cb_data);
return 0; return 0;
} }
@ -2458,8 +2443,8 @@ iq_send_stanza(xmpp_stanza_t *const stanza)
xmpp_send_raw_string(conn, "%s", text); xmpp_send_raw_string(conn, "%s", text);
} }
xmpp_free(connection_get_ctx(), text); xmpp_free(connection_get_ctx(), text);
} }
static void static void
_iq_free_room_data(ProfRoomInfoData *roominfo) _iq_free_room_data(ProfRoomInfoData *roominfo)
{ {

View File

@ -165,6 +165,7 @@ omemo_start_device_session_handle_bundle(xmpp_stanza_t *const stanza, void *cons
xmpp_stanza_t *prekey; xmpp_stanza_t *prekey;
for (prekey = xmpp_stanza_get_children(prekeys); prekey != NULL; prekey = xmpp_stanza_get_next(prekey)) { for (prekey = xmpp_stanza_get_children(prekeys); prekey != NULL; prekey = xmpp_stanza_get_next(prekey)) {
omemo_key_t *key = malloc(sizeof(omemo_key_t)); omemo_key_t *key = malloc(sizeof(omemo_key_t));
key->data = NULL;
const char *prekey_id_text = xmpp_stanza_get_attribute(prekey, "preKeyId"); const char *prekey_id_text = xmpp_stanza_get_attribute(prekey, "preKeyId");
if (!prekey_id_text) { if (!prekey_id_text) {