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;
|