# HG changeset patch # User Sadrul Habib Chowdhury # Date 1255136195 0 # Node ID b8d68532c18888fbafa88321c471a260c06e287b # Parent cb4853d04b92d1481ec318f2563fb15dd349c11e# Parent 6a23d7f841436facc777f94dbec585c4fcb6dd2d merge of '1db1fa363515af9bf20cd293f7ff7995d16099bb' and '3295ae2bdb4e5cae80dc9a5cdd9c53e307d5a255' diff -r cb4853d04b92 -r b8d68532c188 libpurple/protocols/msn/notification.c --- a/libpurple/protocols/msn/notification.c Fri Oct 09 18:54:35 2009 +0000 +++ b/libpurple/protocols/msn/notification.c Sat Oct 10 00:56:35 2009 +0000 @@ -582,7 +582,8 @@ trans = msn_transaction_new(cmdproc, "FQY", "%d", payload_len); msn_transaction_set_payload(trans, payload, payload_len); - msn_transaction_set_data(trans, data); /* XXX: 'data' leaks */ + msn_transaction_set_data(trans, data); + msn_transaction_set_data_free(trans, g_free); msn_cmdproc_send_trans(cmdproc, trans); } @@ -962,9 +963,8 @@ if (cmd->trans->data) { MsnFqyCbData *fqy_data = cmd->trans->data; fqy_data->cb(session, passport, network, fqy_data->data); - /* TODO: This leaks, but the server responds to FQY multiple times, so we - can't free it yet. We need to figure out somewhere else to do so. - g_free(fqy_data); */ + /* Don't free fqy_data yet since the server responds to FQY multipe times. + It will be freed when cmd->trans is freed. */ } g_free(passport); diff -r cb4853d04b92 -r b8d68532c188 libpurple/protocols/msn/oim.c --- a/libpurple/protocols/msn/oim.c Fri Oct 09 18:54:35 2009 +0000 +++ b/libpurple/protocols/msn/oim.c Sat Oct 10 00:56:35 2009 +0000 @@ -373,6 +373,7 @@ msg->oim_msg); g_queue_push_head(oim->send_queue, msg); msn_oim_send_msg(oim); + msg = NULL; } else { purple_debug_info("msn", "Can't find lock key for OIM: %s\n", @@ -393,6 +394,7 @@ purple_debug_info("msn", "Resending OIM: %s\n", msg->oim_msg); g_queue_push_head(oim->send_queue, msg); msn_oim_send_msg(oim); + msg = NULL; } } else { /* Report the error */ @@ -426,6 +428,9 @@ } } } + + if (msg) + msn_oim_free_send_req(msg); } void @@ -481,7 +486,6 @@ g_free(msg_body); g_free(soap_body); - msn_oim_free_send_req(oim_request); } /**************************************** diff -r cb4853d04b92 -r b8d68532c188 libpurple/protocols/msn/transaction.c --- a/libpurple/protocols/msn/transaction.c Fri Oct 09 18:54:35 2009 +0000 +++ b/libpurple/protocols/msn/transaction.c Sat Oct 10 00:56:35 2009 +0000 @@ -59,6 +59,9 @@ g_free(trans->params); g_free(trans->payload); + if (trans->data_free) + trans->data_free(trans->data); + #if 0 if (trans->pendent_cmd != NULL) msn_message_unref(trans->pendent_msg); @@ -165,6 +168,12 @@ trans->data = data; } +void msn_transaction_set_data_free(MsnTransaction *trans, GDestroyNotify fn) +{ + g_return_if_fail(trans != NULL); + trans->data_free = fn; +} + void msn_transaction_add_cb(MsnTransaction *trans, char *answer, MsnTransCb cb) diff -r cb4853d04b92 -r b8d68532c188 libpurple/protocols/msn/transaction.h --- a/libpurple/protocols/msn/transaction.h Fri Oct 09 18:54:35 2009 +0000 +++ b/libpurple/protocols/msn/transaction.h Sat Oct 10 00:56:35 2009 +0000 @@ -48,6 +48,8 @@ guint timer; void *data; /**< The data to be used on the different callbacks. */ + GDestroyNotify data_free; /**< The function to free 'data', or @c NULL */ + GHashTable *callbacks; gboolean has_custom_callbacks; MsnErrorCb error_cb; @@ -71,6 +73,7 @@ void msn_transaction_set_payload(MsnTransaction *trans, const char *payload, int payload_len); void msn_transaction_set_data(MsnTransaction *trans, void *data); +void msn_transaction_set_data_free(MsnTransaction *trans, GDestroyNotify fn); void msn_transaction_add_cb(MsnTransaction *trans, char *answer, MsnTransCb cb); void msn_transaction_set_error_cb(MsnTransaction *trans, MsnErrorCb cb);