diff options
author | Daniel Atallah <datallah@pidgin.im> | 2007-10-09 23:01:11 +0000 |
---|---|---|
committer | Daniel Atallah <datallah@pidgin.im> | 2007-10-09 23:01:11 +0000 |
commit | bab933a33f1302f79d988e8035ed22d89cc408d2 (patch) | |
tree | dd1bbfb4a7779e6a352a4e7d5a167af932d1896d | |
parent | 374eb4ffb51f3fab788da48c2581d86eb2005713 (diff) | |
download | pidgin-bab933a33f1302f79d988e8035ed22d89cc408d2.tar.gz |
Fix CID 337, null pointer deref. Also plug a leak.
-rw-r--r-- | libpurple/protocols/jabber/jabber.c | 93 |
1 files changed, 49 insertions, 44 deletions
diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c index fc5240314c..5f8385abeb 100644 --- a/libpurple/protocols/jabber/jabber.c +++ b/libpurple/protocols/jabber/jabber.c @@ -2189,55 +2189,67 @@ static PurpleCmdRet jabber_cmd_ping(PurpleConversation *conv, return PURPLE_CMD_RET_OK; } -static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv, - const char *cmd, char **args, char **error, void *data) -{ - JabberStream *js = conv->account->gc->proto_data; - xmlnode *msg, *buzz; +static gboolean _jabber_send_buzz(JabberStream *js, const char *username, char **error) { + JabberBuddy *jb; JabberBuddyResource *jbr; - char *to; GList *iter; - if(!args || !args[0]) - return PURPLE_CMD_RET_FAILED; - - jb = jabber_buddy_find(js, args[0], FALSE); + if(!username) + return FALSE; + + jb = jabber_buddy_find(js, username, FALSE); if(!jb) { - *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), args[0]); - return PURPLE_CMD_RET_FAILED; + *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); + return FALSE; } - + jbr = jabber_buddy_find_resource(jb, NULL); if(!jbr) { - *error = g_strdup_printf(_("Unable to buzz, because user %s might be offline."), args[0]); - return PURPLE_CMD_RET_FAILED; + *error = g_strdup_printf(_("Unable to buzz, because user %s might be offline."), username); + return FALSE; } + if(!jbr->caps) { - *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), args[0]); - return PURPLE_CMD_RET_FAILED; + *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); + return FALSE; } + for(iter = jbr->caps->features; iter; iter = g_list_next(iter)) { if(!strcmp(iter->data, "http://www.xmpp.org/extensions/xep-0224.html#ns")) { - msg = xmlnode_new("message"); - to = g_strdup_printf("%s/%s", args[0], jbr->name); - xmlnode_set_attrib(msg,"to",to); + xmlnode *buzz, *msg = xmlnode_new("message"); + gchar *to; + + to = g_strdup_printf("%s/%s", username, jbr->name); + xmlnode_set_attrib(msg, "to", to); g_free(to); - + /* avoid offline storage */ - xmlnode_set_attrib(msg,"type","headline"); - - buzz = xmlnode_new_child(msg,"attention"); - xmlnode_set_namespace(buzz,"http://www.xmpp.org/extensions/xep-0224.html#ns"); - - jabber_send(js,msg); + xmlnode_set_attrib(msg, "type", "headline"); + + buzz = xmlnode_new_child(msg, "attention"); + xmlnode_set_namespace(buzz, "http://www.xmpp.org/extensions/xep-0224.html#ns"); + + jabber_send(js, msg); xmlnode_free(msg); - - return PURPLE_CMD_RET_OK; + + return TRUE; } } - *error = g_strdup_printf(_("Unable to buzz, because the user %s does not support it."), args[0]); - return PURPLE_CMD_RET_FAILED; + + *error = g_strdup_printf(_("Unable to buzz, because the user %s does not support it."), username); + return FALSE; +} + +static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv, + const char *cmd, char **args, char **error, void *data) +{ + JabberStream *js = conv->account->gc->proto_data; + + if(!args || !args[0]) + return PURPLE_CMD_RET_FAILED; + + return _jabber_send_buzz(js, args[0], error) ? PURPLE_CMD_RET_OK : PURPLE_CMD_RET_FAILED; } GList *jabber_attention_types(PurpleAccount *account) @@ -2258,23 +2270,16 @@ GList *jabber_attention_types(PurpleAccount *account) gboolean jabber_send_attention(PurpleConnection *gc, const char *username, guint code) { - PurpleConversation *conv; - char *error; - char *args[1]; - PurpleCmdRet ret; - - conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, username, gc->account); - - args[0] = (char *)username; - - ret = jabber_cmd_buzz(conv, "buzz", args, &error, NULL); + JabberStream *js = gc->proto_data; + gchar *error = NULL; - if (ret == PURPLE_CMD_RET_FAILED) { + if (!_jabber_send_buzz(js, username, &error)) { purple_debug_error("jabber", "jabber_send_attention: jabber_cmd_buzz failed with error: %s\n", error ? error : "(NULL)"); + g_free(error); return FALSE; - } else { - return TRUE; } + + return TRUE; } |