1.1 --- a/ChangeLog
1.2 +++ b/ChangeLog
1.3 @@ -35,6 +35,8 @@
1.4 ICQ account that is configured as an AIM account. (#14437)
1.5
1.6 IRC:
1.7 + * Fix a crash when remote users have certain characters in their
1.8 + nicknames. (Discovered by Djego Ibanez) (#14341)
1.9 * Fix the handling of formatting following mIRC ^O (#14436)
1.10 * Fix crash when NAMES is empty. (James McLaughlin) (#14518)
1.11
2.1 --- a/libpurple/protocols/irc/msgs.c
2.2 +++ b/libpurple/protocols/irc/msgs.c
2.3 @@ -409,14 +409,21 @@
2.4 PurpleConvChat *chat;
2.5 PurpleConvChatBuddy *cb;
2.6
2.7 - char *userhost, *realname;
2.8 + char *cur, *userhost, *realname;
2.9
2.10 PurpleConvChatBuddyFlags flags;
2.11 GList *keys = NULL, *values = NULL;
2.12 -
2.13 +
2.14 + if (!args || !args[0] || !args[1] || !args[2] || !args[3]
2.15 + || !args[4] || !args[5] || !args[6] || !args[7]) {
2.16 + purple_debug(PURPLE_DEBUG_ERROR, "irc",
2.17 + "Got a WHO response with not enough arguments\n");
2.18 + return;
2.19 + }
2.20 +
2.21 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, args[1], irc->account);
2.22 if (!conv) {
2.23 - purple_debug(PURPLE_DEBUG_ERROR, "irc", "Got a WHO response for %s, which doesn't exist\n", args[1]);
2.24 + purple_debug(PURPLE_DEBUG_ERROR, "irc","Got a WHO response for %s, which doesn't exist\n", args[1]);
2.25 return;
2.26 }
2.27
2.28 @@ -429,7 +436,16 @@
2.29 chat = PURPLE_CONV_CHAT(conv);
2.30
2.31 userhost = g_strdup_printf("%s@%s", args[2], args[3]);
2.32 - realname = g_strdup(args[8]);
2.33 +
2.34 + /* The final argument is a :-argument, but annoyingly
2.35 + * contains two "words", the hop count and real name. */
2.36 + for (cur = args[7]; *cur; cur++) {
2.37 + if (*cur == ' ') {
2.38 + cur++;
2.39 + break;
2.40 + }
2.41 + }
2.42 + realname = g_strdup(cur);
2.43
2.44 keys = g_list_prepend(keys, "userhost");
2.45 values = g_list_prepend(values, userhost);
3.1 --- a/libpurple/protocols/irc/parse.c
3.2 +++ b/libpurple/protocols/irc/parse.c
3.3 @@ -74,7 +74,7 @@
3.4 { "331", "nc:", irc_msg_topic }, /* No channel topic */
3.5 { "332", "nc:", irc_msg_topic }, /* Channel topic */
3.6 { "333", "*", irc_msg_ignore }, /* Topic setter stuff */
3.7 - { "352", "nvcvnvvv:", irc_msg_who },/* Channel WHO */
3.8 + { "352", "ncvvvnv:", irc_msg_who }, /* Channel WHO */
3.9 { "353", "nvc:", irc_msg_names }, /* Names list */
3.10 { "366", "nc:", irc_msg_names }, /* End of names */
3.11 { "367", "ncnnv", irc_msg_ban }, /* Ban list */