comparison libpurple/protocols/irc/parse.c @ 32258:062f5781aa57

UTF-8 salvage unknown strings in IRC
author Ethan Blanton <elb@pidgin.im>
date Fri, 30 Sep 2011 18:23:57 +0000
parents d2eb28c12d44
children 44fc11beefab 00ea5f8ef509
comparison
equal deleted inserted replaced
32256:d9d33a4b5632 32258:062f5781aa57
706 args = g_new0(char *, strlen(msgent->format)); 706 args = g_new0(char *, strlen(msgent->format));
707 for (cur = end, fmt = msgent->format, i = 0; fmt[i] && *cur++; i++) { 707 for (cur = end, fmt = msgent->format, i = 0; fmt[i] && *cur++; i++) {
708 switch (fmt[i]) { 708 switch (fmt[i]) {
709 case 'v': 709 case 'v':
710 if (!(end = strchr(cur, ' '))) end = cur + strlen(cur); 710 if (!(end = strchr(cur, ' '))) end = cur + strlen(cur);
711 args[i] = g_strndup(cur, end - cur); 711 /* This is a string of unknown encoding which we do not
712 * want to transcode, but it may or may not be valid
713 * UTF-8, so we'll salvage it. If a nick/channel/target
714 * field has inadvertently been marked verbatim, this
715 * could cause weirdness. */
716 tmp = g_strndup(cur, end - cur);
717 args[i] = purple_utf8_salvage(tmp);
718 g_free(tmp);
712 cur += end - cur; 719 cur += end - cur;
713 break; 720 break;
714 case 't': 721 case 't':
715 case 'n': 722 case 'n':
716 case 'c': 723 case 'c':
724 if (*cur == ':') cur++; 731 if (*cur == ':') cur++;
725 args[i] = irc_recv_convert(irc, cur); 732 args[i] = irc_recv_convert(irc, cur);
726 cur = cur + strlen(cur); 733 cur = cur + strlen(cur);
727 break; 734 break;
728 case '*': 735 case '*':
729 args[i] = g_strdup(cur); 736 /* Ditto 'v' above; we're going to salvage this in case
737 * it leaks past the IRC prpl */
738 args[i] = purple_utf8_salvage(cur);
730 cur = cur + strlen(cur); 739 cur = cur + strlen(cur);
731 break; 740 break;
732 default: 741 default:
733 purple_debug(PURPLE_DEBUG_ERROR, "irc", "invalid message format character '%c'\n", fmt[i]); 742 purple_debug(PURPLE_DEBUG_ERROR, "irc", "invalid message format character '%c'\n", fmt[i]);
734 break; 743 break;