diff options
author | dequis <dx@dxzone.com.ar> | 2015-03-21 05:26:20 -0300 |
---|---|---|
committer | dequis <dx@dxzone.com.ar> | 2015-03-22 10:35:08 -0300 |
commit | 098a75b2b2f6a23b5740f6a2032d8a4c8d0d36b2 (patch) | |
tree | ef90f8b10c0b41fd1a90f2f13c1d8f6bf62fa872 /otr.c | |
parent | 2dd23da38926e777c1dba707350b2afcf9421b25 (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.c | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -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: */ |