--- a/libpurple/protocols/msn/msg.c Mon May 07 03:16:31 2012 +0000
+++ b/libpurple/protocols/msn/msg.c Mon May 07 03:18:08 2012 +0000
@@ -257,13 +257,47 @@
msg->body[msg->body_len] = '\0';
- if ((!content_type || !strcmp(content_type, "text/plain"))
- && msg->charset == NULL) {
- char *body = g_convert(msg->body, msg->body_len, "UTF-8",
- "ISO-8859-1", NULL, &msg->body_len, NULL);
- msg->charset = g_strdup("UTF-8");
+ if (msg->body && content_type && purple_str_has_prefix(content_type, "text/")) { + if (msg->charset == NULL || g_str_equal(msg->charset, "UTF-8")) { + if (!g_utf8_validate(msg->body, msg->body_len, NULL)) { + purple_debug_warning("msn", "Message contains invalid " + "UTF-8. Attempting to salvage.\n"); + body = purple_utf8_salvage(msg->body); + payload_len = strlen(body); + /* Charset is something other than UTF-8 */ + body = g_convert(msg->body, msg->body_len, "UTF-8", + msg->charset, NULL, &payload_len, &err); + purple_debug_warning("msn", "Unable to convert message from " + "%s to UTF-8: %s\n", msg->charset, + err ? err->message : "Unknown error"); + /* Fallback to ISO-8859-1 */ + body = g_convert(msg->body, msg->body_len, "UTF-8", + "ISO-8859-1", NULL, &payload_len, NULL); + msg->body_len = payload_len; + msn_message_set_charset(msg, "UTF-8");