aboutsummaryrefslogtreecommitdiffstats
path: root/otr.c
diff options
context:
space:
mode:
authordequis <dx@dxzone.com.ar>2015-03-21 05:26:20 -0300
committerdequis <dx@dxzone.com.ar>2015-03-22 10:35:08 -0300
commit098a75b2b2f6a23b5740f6a2032d8a4c8d0d36b2 (patch)
treeef90f8b10c0b41fd1a90f2f13c1d8f6bf62fa872 /otr.c
parent2dd23da38926e777c1dba707350b2afcf9421b25 (diff)
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
Diffstat (limited to 'otr.c')
-rw-r--r--otr.c15
1 files changed, 12 insertions, 3 deletions
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: */