jabber: Fix a crash due to a contact having a resource with jbr->name == NULL

Thu, 06 Aug 2009 03:21:59 +0000

author
Paul Aurich <darkrain42@pidgin.im>
date
Thu, 06 Aug 2009 03:21:59 +0000
changeset 28114
091771455e05
parent 28113
9c98ab842cf0
child 28117
b467d0a73d29

jabber: Fix a crash due to a contact having a resource with jbr->name == NULL

This happens with legacy transports, when the transport sends presence
from the bare JID. This then crashes in g_str_hash when trying to look up
the jbr from the resource name. Fixes #9827.

libpurple/protocols/jabber/buddy.c file | annotate | diff | comparison | revisions
--- a/libpurple/protocols/jabber/buddy.c	Wed Aug 05 16:11:20 2009 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Thu Aug 06 03:21:59 2009 +0000
@@ -1193,6 +1193,22 @@
 	g_free(jbri);
 }
 
+static guint jbir_hash(gconstpointer v)
+{
+	if (v)
+		return g_str_hash(v);
+	else
+		return 0;
+}
+
+static gboolean jbir_equal(gconstpointer v1, gconstpointer v2)
+{
+	const gchar *resource_1 = v1;
+	const gchar *resource_2 = v2;
+
+	return purple_strequal(resource_1, resource_2);
+}
+
 static void jabber_version_parse(JabberStream *js, const char *from,
                                  JabberIqType type, const char *id,
                                  xmlnode *packet, gpointer data)
@@ -1464,9 +1480,7 @@
 	char *full_jid = NULL;
 	const char *to;
 
-	g_return_if_fail(jbr->name != NULL);
-
-	if (is_bare_jid) {
+	if (is_bare_jid && jbr->name) {
 		full_jid = g_strdup_printf("%s/%s", jid, jbr->name);
 		to = full_jid;
 	} else
@@ -1535,7 +1549,7 @@
 	jbi->jid = g_strdup(jid);
 	jbi->js = js;
 	jbi->jb = jb;
-	jbi->resources = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, jabber_buddy_info_resource_free);
+	jbi->resources = g_hash_table_new_full(jbir_hash, jbir_equal, g_free, jabber_buddy_info_resource_free);
 	jbi->user_info = purple_notify_user_info_new();
 
 	iq = jabber_iq_new(js, JABBER_IQ_GET);

mercurial