Mercurial > pidgin
comparison libpurple/protocols/irc/msgs.c @ 31820:d2eb28c12d44
Fix a crash when remote users have certain characters in their
nicknames. (Discovered by Djego Ibanez)
Fixes #14341
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 18 Aug 2011 08:41:24 +0000 |
parents | c2a7fde6a566 |
children | a5b556ac1de5 665388a0f573 |
comparison
equal
deleted
inserted
replaced
31819:70ff869a74d1 | 31820:d2eb28c12d44 |
---|---|
407 if (!strcmp(name, "352")) { | 407 if (!strcmp(name, "352")) { |
408 PurpleConversation *conv; | 408 PurpleConversation *conv; |
409 PurpleConvChat *chat; | 409 PurpleConvChat *chat; |
410 PurpleConvChatBuddy *cb; | 410 PurpleConvChatBuddy *cb; |
411 | 411 |
412 char *userhost, *realname; | 412 char *cur, *userhost, *realname; |
413 | 413 |
414 PurpleConvChatBuddyFlags flags; | 414 PurpleConvChatBuddyFlags flags; |
415 GList *keys = NULL, *values = NULL; | 415 GList *keys = NULL, *values = NULL; |
416 | 416 |
417 if (!args || !args[0] || !args[1] || !args[2] || !args[3] | |
418 || !args[4] || !args[5] || !args[6] || !args[7]) { | |
419 purple_debug(PURPLE_DEBUG_ERROR, "irc", | |
420 "Got a WHO response with not enough arguments\n"); | |
421 return; | |
422 } | |
423 | |
417 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, args[1], irc->account); | 424 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, args[1], irc->account); |
418 if (!conv) { | 425 if (!conv) { |
419 purple_debug(PURPLE_DEBUG_ERROR, "irc", "Got a WHO response for %s, which doesn't exist\n", args[1]); | 426 purple_debug(PURPLE_DEBUG_ERROR, "irc","Got a WHO response for %s, which doesn't exist\n", args[1]); |
420 return; | 427 return; |
421 } | 428 } |
422 | 429 |
423 cb = purple_conv_chat_cb_find(PURPLE_CONV_CHAT(conv), args[5]); | 430 cb = purple_conv_chat_cb_find(PURPLE_CONV_CHAT(conv), args[5]); |
424 if (!cb) { | 431 if (!cb) { |
427 } | 434 } |
428 | 435 |
429 chat = PURPLE_CONV_CHAT(conv); | 436 chat = PURPLE_CONV_CHAT(conv); |
430 | 437 |
431 userhost = g_strdup_printf("%s@%s", args[2], args[3]); | 438 userhost = g_strdup_printf("%s@%s", args[2], args[3]); |
432 realname = g_strdup(args[8]); | 439 |
440 /* The final argument is a :-argument, but annoyingly | |
441 * contains two "words", the hop count and real name. */ | |
442 for (cur = args[7]; *cur; cur++) { | |
443 if (*cur == ' ') { | |
444 cur++; | |
445 break; | |
446 } | |
447 } | |
448 realname = g_strdup(cur); | |
433 | 449 |
434 keys = g_list_prepend(keys, "userhost"); | 450 keys = g_list_prepend(keys, "userhost"); |
435 values = g_list_prepend(values, userhost); | 451 values = g_list_prepend(values, userhost); |
436 | 452 |
437 keys = g_list_prepend(keys, "realname"); | 453 keys = g_list_prepend(keys, "realname"); |