From: Stu T. <nos...@us...> - 2004-12-01 02:29:33
|
Update of /cvsroot/gaim/gaim/src/protocols/msn In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10339 Modified Files: Tag: oldstatus cmdproc.c msg.c notification.c session.c slplink.c slpmsg.c switchboard.c transaction.c transaction.h Log Message: Several MSN memory leaks identified and fixed by Miah Gregory and Felipe Contreras, plus my own fix for bug 1075347. As normal, thank them for fixes, blame me for breakages. Did I mention the new MSN icon? It rocks! Index: cmdproc.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/msn/cmdproc.c,v retrieving revision 1.7.2.2 retrieving revision 1.7.2.3 diff -u -d -p -r1.7.2.2 -r1.7.2.3 --- cmdproc.c 21 Nov 2004 17:46:16 -0000 1.7.2.2 +++ cmdproc.c 1 Dec 2004 02:29:20 -0000 1.7.2.3 @@ -116,6 +116,9 @@ msn_cmdproc_send_trans(MsnCmdProc *cmdpr data = msn_transaction_to_string(trans); + if (cmdproc->last_trans != NULL) + g_free(cmdproc->last_trans); + cmdproc->last_trans = g_strdup(data); len = strlen(data); Index: msg.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/msn/msg.c,v retrieving revision 1.36.2.5 retrieving revision 1.36.2.6 diff -u -d -p -r1.36.2.5 -r1.36.2.6 --- msg.c 28 Nov 2004 17:59:37 -0000 1.36.2.5 +++ msg.c 1 Dec 2004 02:29:20 -0000 1.36.2.6 @@ -121,11 +121,13 @@ msn_message_parse_payload(MsnMessage *ms g_return_if_fail(payload != NULL); - tmp_base = tmp = g_memdup(payload, payload_len + 1); - tmp[payload_len] = '\0'; + tmp_base = tmp = g_memdup(payload, payload_len); /* Parse the attributes. */ end = strstr(tmp, "\r\n\r\n"); + /* TODO? some clients use \r delimiters instead of \r\n, the official client + * doesn't send such messages, but does handle receiving them. We'll just + * avoid crashing for now */ g_return_if_fail(end != NULL); *end = '\0'; @@ -141,7 +143,10 @@ msn_message_parse_payload(MsnMessage *ms value = tokens[1]; if (!strcmp(key, "MIME-Version")) + { + g_strfreev(tokens); continue; + } if (!strcmp(key, "Content-Type")) { @@ -214,7 +219,7 @@ msn_message_parse_payload(MsnMessage *ms else { msg->body_len = payload_len - (tmp - tmp_base); - msg->body = g_memdup(tmp, msg->body_len + 1); + msg->body = g_memdup(tmp, msg->body_len); } g_free(tmp_base); @@ -582,18 +587,21 @@ GHashTable * msn_message_get_hashtable_from_body(const MsnMessage *msg) { GHashTable *table; + size_t body_len; const char *body; - char **elems, **cur, **tokens; + char **elems, **cur, **tokens, *body_str; g_return_val_if_fail(msg != NULL, NULL); table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - body = msn_message_get_bin_data(msg, NULL); + body = msn_message_get_bin_data(msg, &body_len); g_return_val_if_fail(body != NULL, NULL); - elems = g_strsplit(body, "\r\n", 0); + body_str = g_strndup(body, body_len); + elems = g_strsplit(body_str, "\r\n", 0); + g_free(body_str); for (cur = elems; *cur != NULL; cur++) { Index: notification.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/msn/notification.c,v retrieving revision 1.114.2.7 retrieving revision 1.114.2.8 diff -u -d -p -r1.114.2.7 -r1.114.2.8 --- notification.c 28 Nov 2004 17:59:38 -0000 1.114.2.7 +++ notification.c 1 Dec 2004 02:29:20 -0000 1.114.2.8 @@ -235,7 +235,6 @@ msg_cmd_post(MsnCmdProc *cmdproc, MsnCom msn_message_parse_payload(msg, payload, len); /* msn_message_show_readable(msg, "Notification", TRUE); */ - msg->remote_user = g_strdup(cmd->params[0]); msn_cmdproc_process_msg(cmdproc, msg); msn_message_destroy(msg); @@ -937,16 +936,36 @@ profile_msg(MsnCmdProc *cmdproc, MsnMess return; if ((value = msn_message_get_attr(msg, "kv")) != NULL) + { + if (session->passport_info.kv != NULL) + g_free(session->passport_info.kv); + session->passport_info.kv = g_strdup(value); + } if ((value = msn_message_get_attr(msg, "sid")) != NULL) + { + if (session->passport_info.sid != NULL) + g_free(session->passport_info.sid); + session->passport_info.sid = g_strdup(value); + } if ((value = msn_message_get_attr(msg, "MSPAuth")) != NULL) + { + if (session->passport_info.mspauth != NULL) + g_free(session->passport_info.mspauth); + session->passport_info.mspauth = g_strdup(value); + } if ((value = msn_message_get_attr(msg, "ClientIP")) != NULL) + { + if (session->passport_info.client_ip != NULL) + g_free(session->passport_info.client_ip); + session->passport_info.client_ip = g_strdup(value); + } if ((value = msn_message_get_attr(msg, "ClientPort")) != NULL) session->passport_info.client_port = ntohs(atoi(value)); @@ -1148,8 +1167,9 @@ connect_cb(MsnServConn *servconn) if (cmdproc->error) return; - session->user = msn_user_new(session->userlist, - gaim_account_get_username(account), NULL); + if (session->user == NULL) + session->user = msn_user_new(session->userlist, + gaim_account_get_username(account), NULL); #if 0 gaim_connection_update_progress(gc, _("Syncing with server"), Index: session.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/msn/session.c,v retrieving revision 1.24.2.5 retrieving revision 1.24.2.6 diff -u -d -p -r1.24.2.5 -r1.24.2.6 --- session.c 28 Nov 2004 17:59:40 -0000 1.24.2.5 +++ session.c 1 Dec 2004 02:29:20 -0000 1.24.2.6 @@ -87,6 +87,9 @@ msn_session_destroy(MsnSession *session) if (session->passport_info.mspauth != NULL) g_free(session->passport_info.mspauth); + if (session->passport_info.client_ip != NULL) + g_free(session->passport_info.client_ip); + if (session->passport_info.file != NULL) { unlink(session->passport_info.file); Index: slplink.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/msn/slplink.c,v retrieving revision 1.12.2.5 retrieving revision 1.12.2.6 diff -u -d -p -r1.12.2.5 -r1.12.2.6 --- slplink.c 21 Nov 2004 17:46:17 -0000 1.12.2.5 +++ slplink.c 1 Dec 2004 02:29:20 -0000 1.12.2.6 @@ -351,6 +351,8 @@ msn_slplink_release_msg(MsnSlpLink *slpl msg->ack_data = slpmsg; msn_slplink_send_msgpart(slplink, slpmsg); + + msn_message_destroy(msg); } void Index: slpmsg.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/msn/slpmsg.c,v retrieving revision 1.4.2.2 retrieving revision 1.4.2.3 diff -u -d -p -r1.4.2.2 -r1.4.2.3 --- slpmsg.c 21 Nov 2004 17:46:17 -0000 1.4.2.2 +++ slpmsg.c 1 Dec 2004 02:29:21 -0000 1.4.2.3 @@ -65,10 +65,20 @@ msn_slpmsg_destroy(MsnSlpMessage *slpmsg if (slpmsg->msg != NULL) { - if (slpmsg->msg->trans != NULL) + MsnTransaction *trans; + + trans = slpmsg->msg->trans; + + if (trans != NULL) { - slpmsg->msg->trans->callbacks = NULL; - slpmsg->msg->trans->data = NULL; + /* Something is pointing to this slpmsg, so we should remove that + * pointer to prevent a crash. */ + + if (trans->callbacks != NULL && trans->has_custom_callbacks) + g_hash_table_destroy(trans->callbacks); + + trans->callbacks = NULL; + trans->data = NULL; } } Index: switchboard.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/msn/switchboard.c,v retrieving revision 1.76.2.5 retrieving revision 1.76.2.6 diff -u -d -p -r1.76.2.5 -r1.76.2.6 --- switchboard.c 30 Nov 2004 02:07:53 -0000 1.76.2.5 +++ switchboard.c 1 Dec 2004 02:29:21 -0000 1.76.2.6 @@ -276,6 +276,9 @@ msg_cmd_post(MsnCmdProc *cmdproc, MsnCom msn_message_parse_payload(msg, payload, len); /* msn_message_show_readable(msg, "SB RECV", FALSE); */ + if (msg->remote_user != NULL) + g_free (msg->remote_user); + msg->remote_user = g_strdup(cmd->params[0]); msn_cmdproc_process_msg(cmdproc, msg); @@ -522,7 +525,9 @@ msg_ack (MsnCmdProc *cmdproc, MsnCommand msg = cmd->trans->data; - msg->ack_cb (msg->ack_data); + msg->ack_cb(msg->ack_data); + + msn_message_unref(msg); } void @@ -547,6 +552,7 @@ msn_switchboard_send_msg(MsnSwitchBoard /* Data for callbacks */ msn_transaction_set_data(trans, msg); + msn_message_ref(msg); if (msg->ack_cb != NULL) { Index: transaction.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/msn/transaction.c,v retrieving revision 1.5.2.1 retrieving revision 1.5.2.2 diff -u -d -p -r1.5.2.1 -r1.5.2.2 --- transaction.c 21 Nov 2004 17:46:17 -0000 1.5.2.1 +++ transaction.c 1 Dec 2004 02:29:21 -0000 1.5.2.2 @@ -75,6 +75,9 @@ msn_transaction_destroy(MsnTransaction * } #endif + if (trans->callbacks != NULL && trans->has_custom_callbacks) + g_hash_table_destroy(trans->callbacks); + if (trans->timer) gaim_timeout_remove(trans->timer); @@ -167,7 +170,13 @@ msn_transaction_add_cb(MsnTransaction *t g_return_if_fail(answer != NULL); if (trans->callbacks == NULL) - trans->callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); + { + trans->has_custom_callbacks = TRUE; + trans->callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, + NULL); + } + else if (trans->has_custom_callbacks != TRUE) + g_return_if_reached (); g_hash_table_insert(trans->callbacks, answer, cb); } Index: transaction.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/msn/transaction.h,v retrieving revision 1.3.2.1 retrieving revision 1.3.2.2 diff -u -d -p -r1.3.2.1 -r1.3.2.2 --- transaction.h 21 Nov 2004 17:46:17 -0000 1.3.2.1 +++ transaction.h 1 Dec 2004 02:29:21 -0000 1.3.2.2 @@ -49,6 +49,7 @@ struct _MsnTransaction void *data; /* The data to be used on the different callbacks */ GHashTable *callbacks; + gboolean has_custom_callbacks; MsnErrorCb error_cb; MsnTimeoutCb timeout_cb; |