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");