summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Atallah <datallah@pidgin.im>2007-10-09 23:01:11 +0000
committerDaniel Atallah <datallah@pidgin.im>2007-10-09 23:01:11 +0000
commitbab933a33f1302f79d988e8035ed22d89cc408d2 (patch)
treedd1bbfb4a7779e6a352a4e7d5a167af932d1896d
parent374eb4ffb51f3fab788da48c2581d86eb2005713 (diff)
downloadpidgin-bab933a33f1302f79d988e8035ed22d89cc408d2.tar.gz
Fix CID 337, null pointer deref. Also plug a leak.
-rw-r--r--libpurple/protocols/jabber/jabber.c93
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;
}