src/protocols/msn/msg.c

changeset 10284
257978b5df5b
parent 10275
186d84a66cc3
child 10345
7d7f8cfa2b4f
--- a/src/protocols/msn/msg.c	Wed Dec 01 01:17:46 2004 +0000
+++ b/src/protocols/msn/msg.c	Wed Dec 01 02:30:47 2004 +0000
@@ -121,11 +121,13 @@
 
 	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 @@
 		value = tokens[1];
 
 		if (!strcmp(key, "MIME-Version"))
+		{
+			g_strfreev(tokens);
 			continue;
+		}
 
 		if (!strcmp(key, "Content-Type"))
 		{
@@ -214,7 +219,7 @@
 	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 @@
 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++)
 	{

mercurial