--- a/libpurple/protocols/yahoo/yahoochat.c Mon Jan 27 17:34:21 2014 +0530 +++ b/libpurple/protocols/yahoo/yahoochat.c Wed Jan 29 00:28:08 2014 +0530 @@ -156,15 +156,25 @@ room = yahoo_string_decode(gc, pair->value, FALSE); break; case 50: /* inviter */ - who = pair->value; - g_string_append_printf(members, "%s\n", who); + if (g_utf8_validate(pair->value, -1, NULL)) { + who = pair->value; + g_string_append_printf(members, "%s\n", who); + } else { + purple_debug_warning("yahoo", "yahoo_process_conference_invite " + "got non-UTF-8 string for key %d\n", pair->key); + } break; case 51: /* This user is being invited to the conference. Comes with status = 11, so we wont reach here */ break; case 52: /* Invited users. Assuming us invited, since we got this packet */ break; /* break needed, or else we add the users to the conference before they accept the invitation */ case 53: /* members who have already joined the conference */ - g_string_append_printf(members, "%s\n", pair->value); + if (g_utf8_validate(pair->value, -1, NULL)) { + g_string_append_printf(members, "%s\n", pair->value); + } else { + purple_debug_warning("yahoo", "yahoo_process_conference_invite " + "got non-UTF-8 string for key %d\n", pair->key); + } break; case 58: g_free(msg); @@ -220,7 +230,12 @@ room = yahoo_string_decode(gc, pair->value, FALSE); break; case 54: - who = pair->value; + if (g_utf8_validate(pair->value, -1, NULL)) { + who = pair->value; + } else { + purple_debug_warning("yahoo", "yahoo_process_conference_decline " + "got non-UTF-8 string for key %d\n", pair->key); + } break; case 14: g_free(msg); @@ -278,7 +293,12 @@ room = yahoo_string_decode(gc, pair->value, FALSE); break; case 53: - who = pair->value; + if (g_utf8_validate(pair->value, -1, NULL)) { + who = pair->value; + } else { + purple_debug_warning("yahoo", "yahoo_process_conference_logon " + "got non-UTF-8 string for key %d\n", pair->key); + } break; } } @@ -310,7 +330,12 @@ room = yahoo_string_decode(gc, pair->value, FALSE); break; case 56: - who = pair->value; + if (g_utf8_validate(pair->value, -1, NULL)) { + who = pair->value; + } else { + purple_debug_warning("yahoo", "yahoo_process_conference_logoff " + "got non-UTF-8 string for key %d\n", pair->key); + } break; } } @@ -341,7 +366,12 @@ room = yahoo_string_decode(gc, pair->value, FALSE); break; case 3: - who = pair->value; + if (g_utf8_validate(pair->value, -1, NULL)) { + who = pair->value; + } else { + purple_debug_warning("yahoo", "yahoo_process_conference_message " + "got non-UTF-8 string for key %d\n", pair->key); + } break; case 14: msg = pair->value; @@ -376,7 +406,6 @@ YahooData *yd = purple_connection_get_protocol_data(gc); struct yahoo_packet *pkt; char *room2; - gboolean utf8 = TRUE; if (yd->wm) { g_return_if_fail(yd->ycht != NULL); @@ -386,7 +415,7 @@ /* apparently room names are always utf8, or else always not utf8, * so we don't have to actually pass the flag in the packet. Or something. */ - room2 = yahoo_string_encode(gc, room, &utf8); + room2 = yahoo_string_encode(gc, room, TRUE); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATJOIN, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "ssss", @@ -533,7 +562,12 @@ info about individual room members, (including us) */ case 109: /* the yahoo id */ - members = g_list_append(members, pair->value); + if (g_utf8_validate(pair->value, -1, NULL)) { + members = g_list_append(members, pair->value); + } else { + purple_debug_warning("yahoo", "yahoo_process_chat_join " + "got non-UTF-8 string for key %d\n", pair->key); + } break; case 110: /* age */ break; @@ -629,9 +663,14 @@ if (pair->key == 104) { g_free(room); room = yahoo_string_decode(gc, pair->value, TRUE); + } else if (pair->key == 109) { + if (g_utf8_validate(pair->value, -1, NULL)) { + who = pair->value; + } else { + purple_debug_warning("yahoo", "yahoo_process_chat_exit " + "got non-UTF-8 string for key %d\n", pair->key); + } } - if (pair->key == 109) - who = pair->value; } if (who && room) { @@ -664,10 +703,20 @@ room = yahoo_string_decode(gc, pair->value, TRUE); break; case 109: - who = pair->value; + if (g_utf8_validate(pair->value, -1, NULL)) { + who = pair->value; + } else { + purple_debug_warning("yahoo", "yahoo_process_chat_message " + "got non-UTF-8 string for key %d\n", pair->key); + } break; case 117: - msg = pair->value; + if (g_utf8_validate(pair->value, -1, NULL)) { + msg = pair->value; + } else { + purple_debug_warning("yahoo", "yahoo_process_chat_message " + "got non-UTF-8 string for key %d\n", pair->key); + } break; case 124: msgtype = strtol(pair->value, NULL, 10); @@ -730,7 +779,12 @@ msg = yahoo_string_decode(gc, pair->value, FALSE); break; case 119: - who = pair->value; + if (g_utf8_validate(pair->value, -1, NULL)) { + who = pair->value; + } else { + purple_debug_warning("yahoo", "yahoo_process_chat_addinvite " + "got non-UTF-8 string for key %d\n", pair->key); + } break; case 118: /* us */ break; @@ -798,10 +852,9 @@ struct yahoo_packet *pkt; GList *who; char *msg, *msg2; - int utf8 = 1; msg = yahoo_html_to_codes(what); - msg2 = yahoo_string_encode(gc, msg, &utf8); + msg2 = yahoo_string_encode(gc, msg, TRUE); pkt = yahoo_packet_new(YAHOO_SERVICE_CONFMSG, YAHOO_STATUS_AVAILABLE, yd->session_id); @@ -811,8 +864,7 @@ yahoo_packet_hash_str(pkt, 53, name); } yahoo_packet_hash(pkt, "ss", 57, room, 14, msg2); - if (utf8) - yahoo_packet_hash_str(pkt, 97, "1"); /* utf-8 */ + yahoo_packet_hash_str(pkt, 97, "1"); /* UTF-8 */ yahoo_packet_send_and_free(pkt, yd); g_free(msg); @@ -857,7 +909,7 @@ char *msg2 = NULL; if (msg) - msg2 = yahoo_string_encode(gc, msg, NULL); + msg2 = yahoo_string_encode(gc, msg, FALSE); members = purple_chat_conversation_get_users(c); @@ -883,9 +935,7 @@ { YahooData *yd = purple_connection_get_protocol_data(gc); struct yahoo_packet *pkt; - char *eroom; - gboolean utf8 = 1; if (yd->wm) { g_return_if_fail(yd->ycht != NULL); @@ -894,7 +944,7 @@ return; } - eroom = yahoo_string_encode(gc, room, &utf8); + eroom = yahoo_string_encode(gc, room, TRUE); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATEXIT, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sss", 104, eroom, 109, dn, 108, "1"); @@ -936,7 +986,6 @@ struct yahoo_packet *pkt; int me = 0; char *msg1, *msg2, *room2; - gboolean utf8 = TRUE; if (yd->wm) { g_return_val_if_fail(yd->ycht != NULL, 1); @@ -951,9 +1000,9 @@ msg2 = yahoo_html_to_codes(msg1); g_free(msg1); - msg1 = yahoo_string_encode(gc, msg2, &utf8); + msg1 = yahoo_string_encode(gc, msg2, TRUE); g_free(msg2); - room2 = yahoo_string_encode(gc, room, NULL); + room2 = yahoo_string_encode(gc, room, FALSE); pkt = yahoo_packet_new(YAHOO_SERVICE_COMMENT, YAHOO_STATUS_AVAILABLE, yd->session_id); @@ -963,8 +1012,7 @@ else yahoo_packet_hash_str(pkt, 124, "1"); /* fixme: what about /think? (124=3) */ - if (utf8) - yahoo_packet_hash_str(pkt, 97, "1"); + yahoo_packet_hash_str(pkt, 97, "1"); /* UTF-8 */ yahoo_packet_send_and_free(pkt, yd); g_free(msg1); @@ -980,7 +1028,6 @@ YahooData *yd = purple_connection_get_protocol_data(gc); struct yahoo_packet *pkt; char *room2, *msg2 = NULL; - gboolean utf8 = TRUE; if (yd->wm) { g_return_if_fail(yd->ycht != NULL); @@ -988,9 +1035,9 @@ return; } - room2 = yahoo_string_encode(gc, room, &utf8); + room2 = yahoo_string_encode(gc, room, TRUE); if (msg) - msg2 = yahoo_string_encode(gc, msg, NULL); + msg2 = yahoo_string_encode(gc, msg, FALSE); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATADDINVITE, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sssss", 1, dn, 118, buddy, 104, room2, 117, (msg2?msg2:""), 129, "0");