diff -up pidgin-2.6.6/libpurple/protocols/silc/ops.c.CVE-2011-3594 pidgin-2.6.6/libpurple/protocols/silc/ops.c --- pidgin-2.6.6/libpurple/protocols/silc/ops.c.CVE-2011-3594 2010-02-16 04:34:06.000000000 -0500 +++ pidgin-2.6.6/libpurple/protocols/silc/ops.c 2011-10-11 01:06:28.736117304 -0400 @@ -408,9 +408,16 @@ silc_private_message(SilcClient client, } if (flags & SILC_MESSAGE_FLAG_UTF8) { - tmp = g_markup_escape_text((const char *)message, -1); + const char *msg = (const char *)message; + char *salvaged = NULL; + if (!g_utf8_validate((const char *)message, -1, NULL)) { + salvaged = purple_utf8_salvage((const char *)message); + msg = salvaged; + } + tmp = g_markup_escape_text(msg, -1); /* Send to Purple */ serv_got_im(gc, sender->nickname, tmp, 0, time(NULL)); + g_free(salvaged); g_free(tmp); } }