Mercurial > pidgin
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; |