From 098a75b2b2f6a23b5740f6a2032d8a4c8d0d36b2 Mon Sep 17 00:00:00 2001 From: dequis Date: Sat, 21 Mar 2015 05:26:20 -0300 Subject: Fix a bunch of memory leaks - irc_im.c: - bee_irc_user_msg: strdup leaks when otr swallows messages - bee_irc_user_action_response: GString leak in all ctcp replies - otr.c: - call g_slist_free() on the list of the otr_policy setting - otr_filter_msg_in: call otrl_tlv_free() if "tlvs" are returned - otr_filter_msg_out: don't g_strdup() if the message should be ignored - log_otr_message: g_strdup_vprintf() leaks always - nogaim.c: - imcb_ask_auth/imcb_ask_add: leaks in g_strdup_printf() - imcb_ask_add leaks imcb_ask_cb_data if the user already exists - add imcb_ask_cb_free() to correctly free its data - msn_util.c: add msn_buddy_ask_free(), ditto - storage_xml.c: pass_cr/password if base64_decode or arc_decode fail - ssl_gnutls.c: conn->hostname leak in error conditions, like invalid certs - jabber_util.c: jabber_buddy_by_ext_jid() leaks jid if it's not an ext jid --- otr.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'otr.c') diff --git a/otr.c b/otr.c index cadb4842..c6c8cd93 100644 --- a/otr.c +++ b/otr.c @@ -286,11 +286,16 @@ gboolean otr_irc_new(irc_t *irc) void otr_irc_free(irc_t *irc) { + set_t *s; otr_t *otr = irc->otr; otr_disconnect_all(irc); b_event_remove(otr->timer); otrl_userstate_free(otr->us); + + s = set_find(&irc->b->set, "otr_policy"); + g_slist_free(s->eval_data); + if (otr->keygen) { kill(otr->keygen, SIGTERM); waitpid(otr->keygen, NULL, 0); @@ -434,6 +439,10 @@ char *otr_filter_msg_in(irc_user_t *iu, char *msg, int flags) ic->acc->user, ic->acc->prpl->name, iu->bu->handle, msg, &newmsg, &tlvs, NULL, NULL, NULL); + if (tlvs) { + otrl_tlv_free(tlvs); + } + if (ignore_msg) { /* this was an internal OTR protocol message */ return NULL; @@ -471,7 +480,7 @@ char *otr_filter_msg_out(irc_user_t *iu, char *msg, int flags) if (otrmsg && otrmsg != msg) { /* libotr wants us to replace our message */ /* NB: caller will free old msg */ - msg = g_strdup(otrmsg); + msg = st ? NULL : g_strdup(otrmsg); otrl_message_free(otrmsg); } @@ -1324,6 +1333,8 @@ void log_otr_message(void *opdata, const char *fmt, ...) va_end(va); log_message(LOGLVL_INFO, "otr: %s", msg); + + g_free(msg); } void display_otr_message(void *opdata, ConnContext *ctx, const char *fmt, ...) @@ -2074,5 +2085,3 @@ void otr_disconnect_all(irc_t *irc) } } } - -/* vim: set noet ts=4 sw=4: */ -- cgit v1.2.3